以下示例: http://www.phpied.com/3-ways-to-define-a-javascript-class/
var apple = {
type: "macintosh",
color: "red",
getInfo: function () {
return this.color + ' ' + this.type + ' apple';
}
};
现在我将getInfo()方法移动到对象声明的顶部。
var apple = {
getInfo: function () {
return this.color + ' ' + this.type + ' apple';
},
type: "macintosh",
color: "red",
};
apple.getInfo();
red macintosh apple
我期待javascript解析器/编译器失败,因为尚未定义this.color和this.type。这在内部如何运作?
(这个问题最初是一个ExtJS框架问题:ExtJS: settings properties via a function on the Prototype: is it a safe pattern?,但我意识到这是一个更普遍的javascript问题,因此这个新问题)
答案 0 :(得分:2)
创建实例后调用该函数。定义时,它不会运行,不会尝试访问属性,但是在您调用getInfo()
函数的地方,它们都存在。事实上,无法在解析各个属性的解释器之间运行任何自定义JavaScript代码。
答案 1 :(得分:2)
在调用函数之前,函数内部的代码不会执行,因此在调用color
之前不会评估this
的属性apple.getInfo()
。
编辑:
var apple = {
getInfo: function () {
return this.color + ' ' + this.type + ' apple';
},
type: "macintosh",
color: "red",
}
}
此时定义了apple对象,
getInfo
属性是一个在评估时返回属性``的函数
apple.getInfo();
现在评估该功能,此时显然已经定义了属性
color
和type
该函数在计算时获取这些属性的值,以便在更改属性color
和type
时,函数的返回值也会更改。
答案 2 :(得分:0)
我原本期望javascript解析器/编译器失败,因为还没有定义this.color和this.type。
编译器中的解析器并不关心。在使用执行的代码之前,JavaScript不会评估是否可以找到属性或变量。在属性的情况下,一个不存在的属性只是被创建(如果你正在写它)或导致值undefined
(如果你正在读它),所以即使您的对象没有color
和type
属性,代码仍然不会抛出错误。你只需得到字符串"undefined undefined apple"
。
Javascript:使用Object literal时,属性的排序是否重要?
事项?可能不是。 有意义吗?是的,从ES6(又名ECMAScript 6又名ECMAScript 20150)开始,是最新的规范。对象初始值设定项中属性的顺序决定了属性的创建顺序,这反过来又部分地设置了for-in
循环访问它们的顺序,它们在Object.keys
数组中显示的顺序,等等(部分是因为可以强制转换为整数的属性名称的处理方式不同。)但是你很少关心它。 this answer和this answer中的详细信息(后者主要是关于数组,但也触及非数组对象)。