JavaScript之prototype断链理解

最近在论坛看到一篇帖子关于prototype断链的,原文如下

var sound = {echo: function() { alert("sound"); } };

function Person() {this.name="name_";};

Person.prototype = sound;//----早点绑上去----

var fo1o = new Person(); 

var xxxxxx=Person.prototype;//----迟了绑上去----??

xxxxxx.yyyy="yyyy_"; 

alert(fo1o.echo);//alert(undefined);
alert(fo1o.yyyy);//alert(undefined);
////////////////////////////////////////////////////////////////////////////////////////////////////
var sound = {echo: function() { alert("sound"); } };

function Person() {this.name="name_";};

var fo1o = new Person(); 

Person.prototype = sound;//----迟了绑上去----

var xxxxxx=Person.prototype;//----迟了绑上去----??

xxxxxx.yyyy="yyyy_"; 

alert(fo1o.echo);//alert(function(){....});
alert(fo1o.yyyy);//alert("yyyy_");

//为什么alert(fo1o.yyyy)会受到影响。

这里的alert注释写反了,不过这不是重点,重点是为什么第二次alert的东西是undefined?而且后来我做了实验,测试如下内容:

1.alert(fo1o.name);//name_

2.Person.prototype.name='_name';alert(fo1o.name);//name_

3.Person.prototype.name='_name';var fo2o=new Person();alert(fo2o.name);//name_

以上三个实验主要是测试prototype能否修改对象原有属性,结果是不能的,因为其实每个对象保存的东西除了固有(即声明时带着)的属性和方法外,还有一个prototype对象,而prototype主要是用来扩充原有对象的功能,就是说,如果访问一个对象的属性时,先在固有属性里找,如果找不到,就再去prototype对象中的属性中找。具体请看下面两个图:

第一个图声明了一个类Person,该类有一个固有属性name和一个prototype属性age,然后声明一个Person的对象a,然后它的name属性从Person类中copy了一份,但是prototype指向的内存还是一样,这里可以把prototype看做一个指针。所以所有Person对象都可以共享prototype的属性和方法(只要Person的prototype指向的位置没变),但是只要Person的prototype重新赋值,指向了另外一片内存,以后声明的Person对象就不能和以前Person对象共享内存了,它们的联系就会切断,a是访问不到sex属性的。

此外,我上面做的三个实验是为了验证prototype属性能否覆盖类固有属性,答案显然不能,它们的内存位置都不一样。那我就有一个问题了,如果prototype里声明了一个和固有属性相同名字的属性,例如Person.prototype.name='hello,world',那么如何通过Person对象来访问prototype的name属性呢?

我的理解就到此结束,上面所述如有不对,请各位大神不吝指正,谢谢。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励