【发布时间】: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 一词不断出现在我正在搜索的许多资源中。如果可以避免的话,我只是不想走错兔子洞。
这两个是我认为最有前途的帖子:
- Property of a Javascript Class calculated from other properties in same Class
- Is it possible to use the computed properties to compute another properties in Vue?
我的问题
如何计算生日(美国日期格式,不使用任何外部依赖项或库),将该值存储为属性,然后反复使用该属性计算同一对象的其他属性。注意:我不是在尝试构造函数和实例等。这只是一个基本的 JavaScript 对象。
如何使用动态计算的属性或方法作为存储值来计算同一对象的其他属性值?
如何使用现代 ES6 JavaScript 技术(包括
toLocaleString()函数)从日期对象中获取月份名称字符串。
【问题讨论】:
-
你的代码引用了
birthdatenumsusa,没有this.;它不是局部变量,而是对象的属性。我建议使用不太相似的变量名称。 -
另外,您正在尝试在普通数组上使用
.toLocaleString();我不知道您希望这样做,但该数组不是 Date 实例。 -
另外,您的
birthdateusagetter 也不会费心返回任何东西。使用 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