0

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

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

来自 C/C++ 的背景,这种语法让我大吃一惊。物业类型从何而来?当我们运行 protoRabbit.speak() 时,它是否添加到 protoRabbit 中?提前致谢。

编辑:感谢您的回复。我很抱歉,因为我似乎没有把我的问题说得很清楚。我感到困惑的是,在我们初始化它之前,属性“类型”是否必须存在。如:

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

当我们初始化它时,它会自动添加为属性吗?如果 protoRabbit 是 const,那会违反 const 初始化吗?

4

2 回答 2

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

于 2017-06-25T21:50:36.043 回答
1

我感到困惑的是在我们初始化它之前是否必须存在属性“类型”......当我们初始化它时它是否自动添加为属性?如果 protoRabbit 是 const,那会违反 const 初始化吗?

您可以随时在对象上设置任何键,而无需先对其进行初始化。变量是否const无关紧要,因为对象 ref 没有被更改,对象本身正在原地发生变异。如果您尝试将不同的对象分配给protoRabbit.

var protoRabbit = {
  speak: ...
};

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

protoRabbit.type = "killer";

protoRabbit这会在called上创建一个属性type。直到这条线才存在。

JavaScript 中的变量,具体来说var,是不同的。它们的引用被提升到声明它们的词法范围的顶部,因此早期的引用不会中断。let不会被提升,并遵循不同的范围语义。

于 2017-06-25T22:34:32.047 回答