javascript读取和改动原型特别须要注意的事儿,由于原型的读写不具有对等性

对于从原型对象继承而来的成员,其读和写具有内在的不正确等性。比方有一个对象A,假设它的原型对象是B。B的原型对象是null。假设我们须要读取A对象的name属性值,那么JS会优先在A中查找。假设找到了name属性那么就返回;假设A中没有name属性。那么就到原型B中查找name。假设找到了就返回;假设原型B中也没有找到,因为此时已经到了原型链的最顶端。还是没有找到name,就直接返回undefined。在写的情况下,运行A.name="aty"。假设A中有name属性。那么会改动name属性的值。假设A没有name属性。那么会在A中新增一个name属性,不会有查找原型的过程。

 

为什么写的时候不理会原型呢?也可以理解,由于原型是全部对象共享的,通过这样的类似的copy-on-write机制。可以保证对象之间不会相互影响。

这样的机制有好有坏,在使用的时候须要注意。

function Person() 
{  
}

//为Person类的原型加入数据
Person.prototype.plainProp="hi";
Person.prototype.objectProp={"age":10};

var a = new Person();
var b = new Person();


a.plainProp="hello";//又一次赋值。没有改变原型

//没有对引用又一次赋值。仅仅是通过引用改动对象的属性
a.objectProp.age=20;

alert(a.plainProp);//hello
alert(b.plainProp);//hi
alert(a.objectProp.age);//20
alert(b.objectProp.age);//20

 

上面代码能够发现。对于原型的写确实有copy-on-write特性。假设我们想知道,属性或方法究竟是来自对象自身,还是来自原型。那么能够使用Object.hasOwnProperty()函数。JS中差点儿全部的函数都不区分数据究竟是来自对象自身,还是其原型链。仅仅有这一个函数区分。


//測试属性是在自身对象,还是在原型中
alert(a.hasOwnProperty("plainProp"))//true
alert(a.hasOwnProperty("objectProp"));//false

posted @ 2017-05-16 10:59  jhcelue  阅读(141)  评论(0编辑  收藏  举报