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

函数在计算时获取这些属性的值,因此如果属性 colortype 发生变化,函数的 return 值也会发生变化。

I was expecting the javascript parser/compiler to fail, since this.color and this.type are not yet defined.

编译器中的解析器不关心。 JavaScript 不会评估是否可以找到 属性 或变量,直到使用它的代码被 执行 。在属性的情况下,一个 属性 还不存在只是被创建(如果你正在写它)或者导致值 undefined (如果你正在读取它) ,所以即使您的对象没有 colortype 属性,代码仍然不会引发错误。你只会得到字符串 "undefined undefined apple".

Javascript: when using Object literal, does ordering of properties matters?

重要吗?可能不重要。 有意义吗? 是的,作为 ES6(又名 ECMAScript 6 又名 ECMAScript 20150)的最新规范。对象初始化器中属性的顺序决定了属性的创建顺序,这反过来部分地设置了 for-in 循环访问它们的顺序,它们在 Object.keys 数组中出现的顺序,等等(部分原因是 属性 可以强制转换为整数的名称的处理方式不同。)但是您很少关心。 and 中的详细信息(后一个主要是关于数组,但也涉及非数组对象)。