Javascript:使用Object literal时,属性的排序是否重要?

时间:2015-08-28 10:55:42

标签: javascript prototype

以下示例: 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问题,因此这个新问题)

3 个答案:

答案 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();
  

现在评估该功能,此时显然已经定义了属性colortype

该函数在计算时获取这些属性的值,以便在更改属性colortype时,函数的返回值也会更改。

答案 2 :(得分:0)

  

我原本期望javascript解析器/编译器失败,因为还没有定义this.color和this.type。

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

  

Javascript:使用Object literal时,属性的排序是否重要?

事项?可能不是。 有意义吗?是的,从ES6(又名ECMAScript 6又名ECMAScript 20150)开始,是最新的规范。对象初始值设定项中属性的顺序决定了属性的创建顺序,这反过来又部分地设置了for-in循环访问它们的顺序,它们在Object.keys数组中显示的顺序,等等(部分是因为可以强制转换为整数的属性名称的处理方式不同。)但是你很少关心它。 this answerthis answer中的详细信息(后者主要是关于数组,但也触及非数组对象)。