【问题标题】:Calculated property of ES6 JavaScript object can't be accessed by object methodES6 JavaScript 对象的计算属性不能被对象方法访问
【发布时间】:2017-12-26 19:19:16
【问题描述】:

问题

这可能很简单,我不确定这(只是因为它处理对象)是否是“面向对象”问题。我构建了一个 JavaScript 对象作为学习练习。我可以访问各种方法和属性,但是,***依赖计算属性的方法返回未定义并给出错误。我不是 JavaScript 专家,大约 6 年前我开始学习 jQuery。现在,我正在尝试自学原生 JavaScript 基础知识。由于 ES6/2015 似乎是我正在尝试学习的最新方法。

我确实有一些 PHP 的 OOP 经验,所以我认识了一些 OOP 概念,但我只能说我有点生疏。

当我尝试查看objActorInfo.birth.birthdateusa的内容时出现问题:

未捕获的 ReferenceError:birthdatenumsusa 未定义 在 Object.getbirthdateusa [作为birthdateusa] (:23:27) 在:1:20

当我 console.log 整个 objActorInfo 对象并检查birthdateusa 属性时,我得到以下附加信息:

[异常:ReferenceError:birthdatenumsusa 未在 Object.get 中定义 在 Object.remoteFunction 上的birthdateusa [asbirthdateusa] (:23:27) (:2:14)]

我不确定自己做错了什么。

我的密码

console.clear();

var objActorInfo = {};

// function birthStrings(date) {

objActorInfo.birth = {

	/* DATES */
	birthYear4: 1960,
	birthMonthNum: 10,
	birthDayOfMO: 18,
	
	get birthDateUSA() {
		/* This method sets the values of multiple properties
			and therefore, according to my understanding, doesn't need
			to return anything.
		*/
		var birthdate4USA = [this.birthMonthNum,this.birthDayOfMO,this.birthYear4].join('/');

		this.birthMonthStr = birthdate4USA.toLocaleString("en", { month: "long"  });
	},

  };

console.log(objActorInfo);
console.log("objActorInfo.birth.birthdateusa: " + objActorInfo.birth.birthdateusa);

我尝试过但没有奏效的方法

我查看了许多在线链接,但其中大多数导致了关于 JavaScript 库的错误报告,而不是原生 JS。我对原型设计知之甚少,到目前为止,还不需要。但是,我注意到prototype 一词不断出现在我正在搜索的许多资源中。如果可以避免的话,我只是不想走错兔子洞。

这两个是我认为最有前途的帖子:

我的问题

  1. 如何计算生日(美国日期格式,不使用任何外部依赖项或库),将该值存储为属性,然后反复使用该属性计算同一对象的其他属性。注意:我不是在尝试构造函数和实例等。这只是一个基本的 JavaScript 对象。

  2. 如何使用动态计算的属性或方法作为存储值来计算同一对象的其他属性值?

  3. 如何使用现代 ES6 JavaScript 技术(包括 toLocaleString() 函数)从日期对象中获取月份名称字符串。

【问题讨论】:

  • 你的代码引用了birthdatenumsusa,没有this.;它不是局部变量,而是对象的属性。我建议使用不太相似的变量名称。
  • 另外,您正在尝试在普通数组上使用.toLocaleString();我不知道您希望这样做,但该数组不是 Date 实例。
  • 另外,您的birthdateusa getter 也不会费心返回任何东西。使用 getter 作为改变对象的方法是非常不合常规的。更“正常”的是让 getter 检查内部计算值是否已经存在,如果不存在则初始化它;无论哪种情况,它都会返回值。
  • @Pointy 谢谢。那么,通过检查和初始化,你的意思是什么?:get birthdateusa() { return this.birthdate_nums_usa = this.birthdate_nums_usa ? this.birthdate_nums_usa : [this.birthmonthnum,this.birthdayofmo,this.birthyear].join('/'); }
  • 您仍然没有从日期部分制作实际的 Date 实例。您需要这样做才能使.toLocaleString() 工作。仅将日期部分与“/”粘合在一起不会给您一个日期。

标签: javascript json oop ecmascript-6 locale


【解决方案1】:

你拼错了birthdatenumsusa

    var birthdatenumsusa = [this.birthmonthnum,this.birthdayofmo,this.birthyear].join('/');
    this.birthdatenumsusa = birthdatenumsusa;

在编写 JavaScript 时,camelCase 是约定俗成的,这样的小错误会更加明显。

【讨论】:

  • 感谢您的回答!好的,我在本地进行了更新...我应该更改问题中的代码以反映它吗?
  • @EricHepperle-CodeSlayer2010 您的代码还在遇到其他问题吗?如果是这样,那么是的,将其添加到您的问题中并更新上下文。如果一切都解决了......那么我认为一个简单的复选标记就足够了。
  • 不,没有解决。我已经进行了调整以简化代码,并根据@Pointy 和您自己迄今为止给出的建议更改了代码。再次感谢您迄今为止的帮助。
  • @EricHepperle-CodeSlayer2010 啊,我的错。您似乎对 OO 原则有很好的理解,所以我认为Date 对象的文档应该回答您的所有问题。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 。之后,parseFloat 将字符串转换为浮点数,或者将parseInt 转换为字符串 -> int
  • 谢谢。我明天必须调查一下并报告。
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 2018-09-13
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
相关资源
最近更新 更多