我写了如下两段代码:
function Person(){} var p1 = new Person(); Person.prototype = { constructor: Person, name: "cxc", age: 20, sayName: function(){ console.log(this.name); } }; p1.sayName();
这一段的运行结果是:Uncaught TypeError: undefined is not a function
function Person(){} Person.prototype = { constructor: Person, name: "cxc", age: 20, sayName: function(){ console.log(this.name); } }; var p1 = new Person(); p1.sayName();
运行结果却是没问题的,为什么会这样呢。
原型不是具有动态性吗,在它上面所做的任何修改不是都会反映到实例上吗。所以我就有些想不明白了,烦劳哪位大神能给解释一下。在此先行谢过了。4 个回答
3
采纳
让我来给你解释一下吧。
看看下面这段代码function Person(){} var proto1 = Person.prototype; var p1 = new Person(); Person.prototype = { constructor: Person, name: "cxc", age: 20, sayName: function(){ console.log(this.name); } }; console.log(Person.prototype.isPrototypeOf(p1)); //输出false console.log(proto1.isPrototypeOf(p1)); //输出true
The isPrototypeOf() method tests for an object in another object's prototype chain.
意思就是:Object.isPrototypeOf(obj)
可以用来检测该原型是否处于obj
对象的原型链上。
在上面这段代码中,首先我将一开始Person.prototype
的引用指向proto1
。
Person.prototype
已经不是p1的原型了,而proto1
还是p1的原型。 其实罪魁祸首就是Person.prototype = {...}
这句话,因为它声明了一个新的对象,让Person.prototype
指向它。
要实现题主所需要的动态增加属性的功能可以这么写:
function Person(){} var p1 = new Person(); Person.prototype.name = 'hi'; Person.prototype.sayName = function(){ console.log(this.name); } p1.sayName();
这样做就不是重新声明一个原型对象,而是对原来的原型对象进行扩展