我一直在关注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初始化?
答案 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
不会被提升,并遵循不同的范围语义。