我正在编写一本教科书,一节课介绍了在定义构造函数时使用点符号。 (据了解,还有其他语法可用于命名属性。)在尝试课程的排列时,结果会引起一些混淆。
预期的一个结果是未定义的,来自以下示例:
function person(){
person.thing = 2;
}
console.log(person.thing);
// outcome: undefined
但是,首先从构造函数创建对象的替代实验会为person.thing
的值产生意外结果:
function person(){
person.thing = 2;
}
var bob = new person();
console.log(bob.thing);
// outcome: undefined
console.log(person.thing);
// outcome: 2
为什么在不同命名的对象person.thing
之后,属性bob
的值现在为2是从构造函数创建的?
答案 0 :(得分:1)
person
总是引用该函数对象。当您调用person
函数时,它实际上会运行,因此它将该属性放在对象上。
将属性放在任何其他对象上的函数没有什么不同,例如:
var myObj = {}
function person() {
myObj.thing = 2
}
console.log("person.thing:", person.thing) // undefined
console.log("myObj.thing:", myObj.thing) // undefined
var bob = new person()
console.log("bob.thing:", bob.thing) // undefined
console.log("person.thing:", person.thing) // undefined
console.log("myObj.thing:", myObj.thing) // 2
所以唯一的区别是我们现在将thing
属性添加到myObj
对象而不是person
函数对象。
所以person
永远不会与构造函数创建的对象有任何关系...... 是构造函数。
在构造函数中,访问正在创建的对象的方法是使用this
关键字。因此,如果您执行this.thing = 2
,则bob.thing
将为2
。
答案 1 :(得分:0)
而不是使用person
function person(){
person.thing = 2;
}
var bob = new person();
console.log(bob.thing);
// outcome: undefined
console.log(person.thing);
// outcome: 2
把它改成这个
function person(){
this.thing = 2;
}
var bob = new person();
console.log(bob.thing);
// outcome: 2
console.log(person.thing);
// outcome: undefined
<块引用>
你注意到结果了吗?