javascript读取和改动原型特别须要注意的事儿,由于原型的读写不具有对等性
JavaScript 读取 读写 注意 原型 具有 事儿 由于
2023-09-27 14:23:30 时间
对于从原型对象继承而来的成员,其读和写具有内在的不正确等性。比方有一个对象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
相关文章
- 菜鸟教程 之 JavaScript 教程
- javascript解决方案插件
- javascript笔记
- JavaScript原型,原型链 ? 有什么特点?
- 四款工具顺利实现 Python 与 JavaScript 间的代码转换
- JavaScript实现http地址自动检测并添加URL链接
- 【JavaScript】JavaScript函数的参数
- 在 2016 年学 JavaScript 是一种什么样的体验?(React从入门到放弃)
- 《第三方JavaScript编程》——第1章 第三方JavaScript介绍 1.1 第三方JavaScript的定义
- JavaScript中十种一步拷贝数组的方法
- 解决报错 We‘re sorry but doesn‘t work properly without JavaScript enabled. Please enable it to continue.
- Web网站模板-响应式个人企业照片墙展示网站模板(HTML+CSS+JavaScript)
- 使用 Exif.js 插件JavaScript脚本读取图片元信息
- JavaScript事件代理和事件委托
- Effective JavaScript Item 31 优先使用Object.getPrototypeOf,而不是__proto__
- Javascript:存储和读取cookie