javascript读取和修改原型特别需要注意的事儿,因为原型的读写不具有对等性
2014-09-29 20:35
337 查看
对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象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机制,能够保证对象之间不会相互影响。这种机制有好有坏,在使用的时候需要注意。
上面代码可以发现,对于原型的写确实有copy-on-write特性。如果我们想知道,属性或方法到底是来自对象自身,还是来自原型,那么可以使用Object.hasOwnProperty()函数。JS中几乎所有的函数都不区分数据到底是来自对象自身,还是其原型链,只有这一个函数区分。
为什么写的时候不理会原型呢?也可以理解,因为原型是所有对象共享的,通过这种类似的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
相关文章推荐
- javascript读取和改动原型特别须要注意的事儿,由于原型的读写不具有对等性
- 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用,不过要注意的是线程间需要做好同步。
- 下载文件使用缓存(一次性读取到内存),优化性能(注意静态对象修改需要加锁)
- android文件管理器,通知界面修改;4.4以后读取sd卡也需要权限;ctrl+shift+f注意在英文下;取消屏幕闪烁
- JavaScriptRegularExpression 转义与替换 需要注意的细节
- VS2008中关于将旧VC方案修改为最新的MFC Feature Pack最需要注意的问题
- Mater-Details数据查询修改时,在用DetailsView进行新建,编辑(添加DropDownList控件)应用时需要注意的几点问题
- 使用SQL存储过程要特别注意的问题-注意顺序读取
- 使用XHTML1.0 Strict中需要特别注意的地方
- 生活中特别需要注意的一些小案例
- 使用SQL存储过程要特别注意的问题-注意顺序读取
- Windows Server 2003中的IIS 6.0默认设置是特别严格和安全的,最大只能传送 204800个字节,我们需要修改,以允许从IE中上传更大的附件。解决办法是
- Javascript中计算浮点数时的一点需要注意的地方
- moss中修改master页需要注意的地方
- SPD开发工作流需要注意的地方1【SPD开发的工作流中如何修改审批状态】
- ASP.NET中实现二级或多级域名(修改UrlRewrite)需要注意的问题
- MSSQL2000右键修改存储过程需要注意的问题
- ASP.NET中实现二级或多级域名(修改UrlRewrite)需要注意的问题
- 线程中需要特别注意的volatile
- Firefox中Javascript使用event对象需要注意的问题