javascript读取和修改原型特别需要注意的事儿,因为原型的读写不具有对等性
来源:互联网 发布:天刀捏脸数据百度云 编辑:程序博客网 时间:2024/05/16 09:19
对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象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
0 0
- javascript读取和修改原型特别需要注意的事儿,因为原型的读写不具有对等性
- javascript原型的那些事儿
- JavaScript的原型和原型链
- JavaScript原型重写的问题注意
- Javascript的类和原型
- javascript读书笔记2----使用原型进行扩展的一个需要注意的地方
- Javascript中对象的原型和对象的原型对象
- Javascript原型链和原型的一个误区
- JavaScript探秘:强大的原型和原型链
- JavaScript探秘:强大的原型和原型链
- JavaScript探秘:强大的原型和原型链
- Javascript原型链和原型的一个误区
- 深入JavaScript(5)强大的原型和原型链
- 深入理解JavaScript的原型和原型链
- 深入理解JavaScript系列--------强大的原型和原型链
- 三张图搞懂JavaScript的原型对象和原型链
- 原型模式和基于原型继承的JavaScript对象系统
- 对象及原型中的几个需要注意的地方
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第7章节--打包并部署SP2013 Apps 总结
- hdu 1048 The Hardest Problem Ever
- matlab aviread Unable to locate decompressor to decompress video stream(问题解决最佳方案)
- hdu 5038 水题 但是题意坑
- Oracle_学习笔记_转换SCN
- javascript读取和修改原型特别需要注意的事儿,因为原型的读写不具有对等性
- 同步FIFO的Verilog实现
- Java 加载Properties文件的六种方式
- Git(一):Git与版本控制简介
- 对象与类
- BlockingQueue
- HDU 5042 分段乱搞
- 补充前面Java 加载Properties文件的六种方式
- API藏得这么深好么