日期:2014-05-16 浏览次数:20406 次
最近在论坛看到一篇帖子关于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)会受到影响。
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属性呢?
我的理解就到此结束,上面所述如有不对,请各位大神不吝指正,谢谢。