Javascript 初始化对象属性

Javascript 初始化对象属性,javascript,eloquent,this,initializing,Javascript,Eloquent,This,Initializing,我一直在关注有说服力的Javascript,并且遇到了这段代码: var protoRabbit = { speak: function(line) { console.log("The " + this.type + " rabbit says '" + line + "'"); } }; 来自C/C++的背景,这种语法让我很反感。属性类型从何而来?当我们运行protoRabbit.speak()时,它是否添加到protoRabbit中?提前谢

我一直在关注有说服力的Javascript,并且遇到了这段代码:

var protoRabbit = {
  speak: function(line) {
    console.log("The " + this.type + " rabbit says '" +
                line + "'");
  }
};
来自C/C++的背景,这种语法让我很反感。属性类型从何而来?当我们运行protoRabbit.speak()时,它是否添加到protoRabbit中?提前谢谢

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

var protoRabbit = {type: "some value", speak: ... };
当我们初始化它时,它是否自动添加为属性?如果protoRabbit是const,这会违反const初始化吗

属性类型从何而来

代码中没有任何地方。如果调用该函数,您将看到它是未定义的

var-protoRabbit={
发言:功能(行){
log(“兔子说的“+this.type+”)+
行+“'”;
}
};
protoRabbit.speak(“{line variable}”)
属性类型从何而来

代码中没有任何地方。如果调用该函数,您将看到它是未定义的

var-protoRabbit={
发言:功能(行){
log(“兔子说的“+this.type+”)+
行+“'”;
}
};
protoRabbit.speak(“{line variable}”)
我感到困惑的是,在初始化属性“type”之前,它是否必须存在。。。当我们初始化它时,它是否自动添加为属性?如果protoRabbit是const,这会违反const初始化吗

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

var protoRabbit = {
  speak: ...
};
这将创建一个具有一个名为
speak
的属性的对象

protoRabbit.type = "killer";
这将在
protoRabbit
上创建一个名为
type
的属性。直到这一行它才存在

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

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

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

var protoRabbit = {
  speak: ...
};
这将创建一个具有一个名为
speak
的属性的对象

protoRabbit.type = "killer";
这将在
protoRabbit
上创建一个名为
type
的属性。直到这一行它才存在


JavaScript中的变量,特别是
var
,是不同的。到声明它们的词法范围的顶部,以便早期引用不会中断
let
不会被提升,并且遵循不同的作用域语义。

进一步浏览代码,您会注意到该方法并没有被称为
protoRabbit.speak()
,而是在一个确实具有
.type
属性的对象上调用。如果您只是尝试这样调用它,它确实会显示为
未定义的
。进一步查看代码,您会注意到该方法不是作为
protoRabbit.speak()
调用的,而是在一个确实具有
.type
属性的对象上调用的。如果你试着这样调用它,它确实会显示为
未定义的
。谢谢!这正是我所困惑的。谢谢!这正是我所困惑的。