初始化对象属性

时间:2017-06-25 21:47:17

标签: javascript eloquent this initializing

我一直在关注Eloquent Javascript并且遇到过这段代码:

var protoRabbit = {
  speak: function(line) {
    console.log("The " + this.type + " rabbit says '" +
                line + "'");
  }
};

来自C / C ++的背景,这种语法让我失望。 type 属性来自哪里?当我们运行protoRabbit.speak()时它是否被添加到protoRabbit?提前谢谢。

编辑:感谢您的回复。我道歉,因为我似乎没有明白我的问题。令我困惑的是,在我们初始化它之前,属性'type'是否必须存在。如:

var protoRabbit = {type: "some value", speak: ... };

初始化时会自动添加为属性吗?如果protoRabbit是const,是否会违反const初始化?

2 个答案:

答案 0 :(得分:2)

  

物业类型来自哪里?

代码中没有任何地方。如果你调用该函数,你会看到它是undefined

var protoRabbit = {
  speak: function(line) {
    console.log("The " + this.type + " rabbit says '" +
                line + "'");
  }
};

protoRabbit.speak("{line variable}");

挖出书。这似乎是您正在谈论的代码部分:

var protoRabbit = {
speak : function ( line ) {
console.log (" The " + this . type + " rabbit says '" +
line + " '") ;
}
};
var killerRabbit = Object.create(protoRabbit);
killerRabbit.type = "killer";
killerRabbit.speak ("SKREEEE !") ;
// → The killer rabbit says 'SKREEEE !'

您可以在几行之后看到type对象上定义的killerRabbit属性。

答案 1 :(得分:1)

  

我感到困惑的是该物业是否属于'必须在我们初始化它之前存在...它是否在我们初始化时自动添加为属性?如果protoRabbit是const,是否会违反const初始化?

您可以随时在对象上设置任何键,而无需先进行初始化。变量是否为const并不重要,因为对象引用未被更改,对象本身正在变异。如果您尝试将其他对象分配给protoRabbit,则只会遇到麻烦。

var protoRabbit = {
  speak: ...
};

这将创建一个具有一个名为speak的属性的对象。

protoRabbit.type = "killer";

这会在名为protoRabbit的{​​{1}}上创建一个属性。它直到这一行才存在。

JavaScript中的变量,特别是type,是不同的。 Their reference is hoisted到声明它们的词法范围的顶部,以便之前的引用不会中断。 var不会被提升,并遵循不同的范围语义。