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对象么?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
你的写法等同于以下:
因此:
如果在
a.sex之前定义window.age:补充:我觉得你的错误就在于在此种情况下:
很单纯的把
= {...}这里的对象字面量当成了A原型对象,所以就得出结论:然而,当你这样写
A.prototype = {}的时候,你并没有去扩展A.prototype,而是用一个新的对象字面量重写了A.prototype,而这个新的对象字面量创建于window之下,于是里面的this.xxx自然不可能指向你设想的a这种错误很容易察觉,只要你坚持这样去写:
this的指向就会变得一目了然。这就是为什么所有的代码规范都不推荐用新对象覆盖原型属性的原因(之一)。在你给
sex赋值的时候,this的值是window,至于原理,你可以参考一下页面右边的相似问题http://www.cnblogs.com/TomXu/archive/2012/01/17/2310479.html
sex : this.age 是A.prototype的一个属性,A.prototype也是一个普通的对象,所以这个sex找的是A.prototype所包含的age属性,没有则undefined,
中的this.age指向A的一个本地属性,实例固然可以访问到,
请先了解javascript作用域相关知识
prototype 应该要跟函数的吧 ,直接赋予属性是不行的
一个function是一个作用域,click 的 function里面的作用域和A的作用域不同。
呃,有人踩我,一个function是一个闭包,this指向不同,我哪里说错了啊,理解这个好多问题都解释通了