我写了如下两段代码: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 回答
烙印99
TA贡献1829条经验 获得超13个赞
prototype才没有楼主认为的“动态”功能呢。
不然楼主的反例该如何解释呢,对吧。
你的空函数创建后,创建了一个原型对象P,Person.prototype会指向P。
原型对象P中,有constructor属性,指向其构造函数Person。
还有一个不可枚举的内部属性[[prototype]],chrome和firefox下可以用__proto__属性来获取,该指针指向Object对象的原型对象。
此时,原型对象P中,并没有sayName方法,所以,var p1 = new Person();,p1此时也不会拥有sayName方法。
慕村9548890
TA贡献1884条经验 获得超4个赞
其实问题的核心只有一点
就算你重写构造函数的原型后,实例的指针仍然指向其当初构造函数的原型
你进行重写后
你新原型的constructor属性指向Person,但是实例p1指向的原型仍然为Object.prototype
即p1的[[prototype]]隐式属性仍然为Object.prototype,故不会存在相应的方法sayName()
你重写了构造函数的原型不等于实例也会和构造函数一起改变相应的指针
要知道关键字new才是进行一系列原型传递的信号,你有兴趣可以看看
添加回答
举报
0/150
提交
取消
