javascript读取和修改原型特别需要注意原型的读写不具有对等性
Java  /  管理员 发布于 3年前   189
对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象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);//helloalert(b.plainProp);//hialert(a.objectProp.age);//20alert(b.objectProp.age);//20
上面代码可以发现,对于原型的写确实有copy-on-write特性。如果我们想知道,属性或方法到底是来自对象自身,还是来自原型,那么可以使用Object.hasOwnProperty()函数。JS中几乎所有的函数都不区分数据到底是来自对象自身,还是其原型链,只有这一个函数区分。
//测试属性是在自身对象,还是在原型中alert(a.hasOwnProperty("plainProp"))//truealert(a.hasOwnProperty("objectProp"));//false
文章来源:http://blog.csdn.net/aitangyong/article/details/39674937
博主 在
2023年国务院办公厅春节放假通知:1月21日起休7天中评论 @ xiaoB 你只管努力,剩下的叫给天意;天若有情天亦老,..xiaoB 在
2023年国务院办公厅春节放假通知:1月21日起休7天中评论 会不会春节放假后又阳一次?..BUG4 在
你翻墙过吗?国内使用vpn翻墙可能会被网警抓,你需了解的事中评论 不是吧?..博主 在
go语言+beego框架中获取get,post请求的所有参数中评论 @ t1 直接在router.go文件中配就ok..Jade 在
如何在MySQL查询中获得当月记录中评论 Dear zongscan.com team, We can skyroc..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号