Javascript构造函数中的属性的点表示法

时间:2017-03-26 22:13:44

标签: javascript constructor properties

我正在编写一本教科书,一节课介绍了在定义构造函数时使用点符号。 (据了解,还有其他语法可用于命名属性。)在尝试课程的排列时,结果会引起一些混淆。

预期的一个结果是未定义的,来自以下示例:

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是从构造函数创建的?

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
<块引用>

你注意到结果了吗?