Javascript:使用对象字面量时,属性的顺序重要吗?
Javascript: when using Object literal, does ordering of properties matters?
以下面的例子为例:
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 parser/compiler 会失败,因为 this.color 和 this.type 尚未定义。这在内部如何运作?
(这个问题最初是这里的 ExtJS 框架问题:ExtJS: settings properties via a function on the Prototype: is it a safe pattern?,但我意识到这是一个更一般的 javascript 问题,因此这个新问题)
创建实例后调用该函数。定义时,它不是 运行,不会尝试访问属性,但在您调用 getInfo()
函数的地方,它们都存在。事实上,在解析各个属性的解释器之间无法 运行 任何自定义 JavaScript 代码。
函数内的代码在您调用它之前不会执行,因此 this
的 属性 color
在调用 apple.getInfo()
之前不会计算。
编辑:
var apple = {
getInfo: function () {
return this.color + ' ' + this.type + ' apple';
},
type: "macintosh",
color: "red",
}
}
At this time the apple object is defined, and the getInfo
property is a function that will return the properties ``when it is evaluated
apple.getInfo();
The function is now evaluated, and the properties color
and type
have clearly already been defined at this point
函数在计算时获取这些属性的值,因此如果属性 color
和 type
发生变化,函数的 return 值也会发生变化。
I was expecting the javascript parser/compiler to fail, since this.color and this.type are not yet defined.
编译器中的解析器不关心。 JavaScript 不会评估是否可以找到 属性 或变量,直到使用它的代码被 执行 。在属性的情况下,一个 属性 还不存在只是被创建(如果你正在写它)或者导致值 undefined
(如果你正在读取它) ,所以即使您的对象没有 color
和 type
属性,代码仍然不会引发错误。你只会得到字符串 "undefined undefined apple"
.
Javascript: when using Object literal, does ordering of properties matters?
重要吗?可能不重要。 有意义吗? 是的,作为 ES6(又名 ECMAScript 6 又名 ECMAScript 20150)的最新规范。对象初始化器中属性的顺序决定了属性的创建顺序,这反过来部分地设置了 for-in
循环访问它们的顺序,它们在 Object.keys
数组中出现的顺序,等等(部分原因是 属性 可以强制转换为整数的名称的处理方式不同。)但是您很少关心。 and 中的详细信息(后一个主要是关于数组,但也涉及非数组对象)。
以下面的例子为例: 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 parser/compiler 会失败,因为 this.color 和 this.type 尚未定义。这在内部如何运作?
(这个问题最初是这里的 ExtJS 框架问题:ExtJS: settings properties via a function on the Prototype: is it a safe pattern?,但我意识到这是一个更一般的 javascript 问题,因此这个新问题)
创建实例后调用该函数。定义时,它不是 运行,不会尝试访问属性,但在您调用 getInfo()
函数的地方,它们都存在。事实上,在解析各个属性的解释器之间无法 运行 任何自定义 JavaScript 代码。
函数内的代码在您调用它之前不会执行,因此 this
的 属性 color
在调用 apple.getInfo()
之前不会计算。
编辑:
var apple = {
getInfo: function () {
return this.color + ' ' + this.type + ' apple';
},
type: "macintosh",
color: "red",
}
}
At this time the apple object is defined, and the
getInfo
property is a function that will return the properties ``when it is evaluated
apple.getInfo();
The function is now evaluated, and the properties
color
andtype
have clearly already been defined at this point
函数在计算时获取这些属性的值,因此如果属性 color
和 type
发生变化,函数的 return 值也会发生变化。
I was expecting the javascript parser/compiler to fail, since this.color and this.type are not yet defined.
编译器中的解析器不关心。 JavaScript 不会评估是否可以找到 属性 或变量,直到使用它的代码被 执行 。在属性的情况下,一个 属性 还不存在只是被创建(如果你正在写它)或者导致值 undefined
(如果你正在读取它) ,所以即使您的对象没有 color
和 type
属性,代码仍然不会引发错误。你只会得到字符串 "undefined undefined apple"
.
Javascript: when using Object literal, does ordering of properties matters?
重要吗?可能不重要。 有意义吗? 是的,作为 ES6(又名 ECMAScript 6 又名 ECMAScript 20150)的最新规范。对象初始化器中属性的顺序决定了属性的创建顺序,这反过来部分地设置了 for-in
循环访问它们的顺序,它们在 Object.keys
数组中出现的顺序,等等(部分原因是 属性 可以强制转换为整数的名称的处理方式不同。)但是您很少关心。