javascript读取和修改原型特别需要注意原型的读写不具有对等性
Java  /  管理员 发布于 2年前   108
对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象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
阿凡达123 在
golang 怎么做热更新中评论 也可以看看这个:https://github.com/edwingeng/hot..博主 在
hyperf框架常用命令-在centos7中退出命令及在docker容器中退出命令中评论 @路过的靓仔:cdn静态资源被墙,已修复..GGGGGGGGG 在
layui框架常用输入框介绍中评论 写的很好解决问题..路过的靓仔 在
hyperf框架常用命令-在centos7中退出命令及在docker容器中退出命令中评论 剩下好多 wait 状态的..激光豆芽 在
为什么你不能安逸?国内996为什么没有国外955香?中评论 国内现在无意义的内卷太多了..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号