前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript之prototype断链理解

JavaScript之prototype断链理解

作者头像
forrestlin
发布2018-05-23 17:51:07
3810
发布2018-05-23 17:51:07
举报
文章被收录于专栏:蜉蝣禅修之道蜉蝣禅修之道

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

代码语言:javascript
复制
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属性呢?

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014年04月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档