function A() {
this.age = 100;
}
A.prototype = {
constructor : A,
sex : this.age,
click : function () {
return this.age;
}
};
var a = new A();
console.log(a.sex); // undefined
console.log(a.click()); // 100
为什么a.sex
没有值,而click()
却可以?原理上是怎么回事,最后不都是指向a
对象么?
你的写法等同于以下:
因此:
如果在
a.sex
之前定义window.age
:补充:我觉得你的错误就在于在此种情况下:
很单纯的把
= {...}
这里的对象字面量当成了A
原型对象,所以就得出结论:然而,当你这样写
A.prototype = {}
的时候,你并没有去扩展A.prototype
,而是用一个新的对象字面量重写了A.prototype
,而这个新的对象字面量创建于window
之下,于是里面的this.xxx
自然不可能指向你设想的a
这种错误很容易察觉,只要你坚持这样去写:
this
的指向就会变得一目了然。这就是为什么所有的代码规范都不推荐用新对象覆盖原型属性的原因(之一)。