为了账号安全,请及时绑定邮箱和手机立即绑定

关于js对象实例以及原型的一点疑惑

关于js对象实例以及原型的一点疑惑

慕盖茨4494581 2019-03-20 19:15:45
我写了如下两段代码: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才没有楼主认为的“动态”功能呢。
不然楼主的反例该如何解释呢,对吧。

你的空函数创建后,创建了一个原型对象PPerson.prototype会指向P
原型对象P中,有constructor属性,指向其构造函数Person
还有一个不可枚举的内部属性[[prototype]],chrome和firefox下可以用__proto__属性来获取,该指针指向Object对象的原型对象。

此时,原型对象P中,并没有sayName方法,所以,var p1 = new Person();p1此时也不会拥有sayName方法。


查看完整回答
反对 回复 2019-04-12
?
慕村9548890

TA贡献1884条经验 获得超4个赞

其实问题的核心只有一点
就算你重写构造函数的原型后,实例的指针仍然指向其当初构造函数的原型
你进行重写后
你新原型的constructor属性指向Person,但是实例p1指向的原型仍然为Object.prototype
p1[[prototype]]隐式属性仍然为Object.prototype,故不会存在相应的方法sayName()
你重写了构造函数的原型不等于实例也会和构造函数一起改变相应的指针
要知道关键字new才是进行一系列原型传递的信号,你有兴趣可以看看

查看完整回答
反对 回复 2019-04-12
  • 4 回答
  • 0 关注
  • 387 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号