function Person(name) {
this.name = name;
}
var p1 = new Person("张三");
Person.prototype.greeting = function () {
return "你好,我叫" + this.name;
};
p1.name; // 张三
p1.greeting(); // 你好,我叫张三
p1.constructor === Person; // true
/* so far so good, but... */
Person.prototype = {
say: function () {
return "你好,我叫" + this.name;
}
};
p1.say(); // TypeError: Object #<Person> has no method 'say'
p1.constructor.prototype; // Object { say: function }
Person 的原型属性里明明有 say 方法,为什么访问不到,求解释,谢谢!
咦?这个例子好眼熟的说……
因为你在实例化
p1
以后覆盖了原型对象(用一个新的对象字面量赋值了),而p1
拥有的是指向旧的原型对象的指针。另外,
p1.constructor
指向的是构造器本身,所以它可以获取到新的原型对象。如果你用Person.prototype.say = function () {...}
的方式去追加方法(这就不是覆盖了),那么p1.say()
就会正常访问。BTW,在覆盖的前提下也可以这样访问到: