正在初始化对象 属性

Initializing Object Property

我一直在关注 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 初始化吗?

Where did the property type come from?

该代码中没有任何内容。如果调用该函数,您将看到它是 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 !'

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

What I'm confused about is whether or not the property 'type' has to exist before we initialize it ... Is it automatically added as a property when we initialize it? If protoRabbit was const, would that violate the const initialization?

您可以随时在对象上设置任何键,而无需先对其进行初始化。变量是否为 const 并不重要,因为对象 ref 没有被更改,对象本身正在发生突变。如果您尝试将不同的对象分配给 protoRabbit,您只会 运行 遇到麻烦。

var protoRabbit = {
  speak: ...
};

这将创建一个对象 属性,名为 speak

protoRabbit.type = "killer";

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

JavaScript 中的变量,特别是 var 中的变量不同。 Their reference is hoisted 到声明它们的词法范围的顶部,这样早期的引用就不会中断。 let 不会被提升,并遵循不同的范围语义。