当前位置:首页 > 开发 > Web前端 > JavaScript > 正文

javascript读取和修改原型特别需要注意原型的读写不具有对等性

发表于: 2015-06-21   作者:bijian1013   来源:转载   浏览:
摘要:         对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象A,假设它的原型对象是B,B的原型对象是null。如果我们需要读取A对象的name属性值,那么JS会优先在A中查找,如果找到了name属性那么就返回;如果A中没有name属性,那么就到原型B中查找name,如果找到了就返回;如果原型B中也没有

        对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象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

 

文章来源:http://blog.csdn.net/aitangyong/article/details/39674937

javascript读取和修改原型特别需要注意原型的读写不具有对等性

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
许多人对JavaScript的原型及原型链仍感到困惑,网上的文章又大多长篇大论,令读者不明觉厉。本人小
js原型 问题:什么是js原型? js每声明一个function,都有prototype原型,prototype原型是函数的一
情况1: <script type="text/javascript"> function Person(){ } var friend = new Person();
当我开始学习JavaScript的对象模型时,第一反应就是难以置信。我完全被它的原型本质给弄糊涂了,毕
<script type="text/javascript"> function Person(name) { this.name = name; this.sayName
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对
用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只
1.基本概念 1.1 原型 每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向了一个对
转载:http://msdn.microsoft.com/en-us/magazine/ff852808.aspx 这篇文章讲Javascript中的原型与继
转载:http://msdn.microsoft.com/en-us/magazine/ff852808.aspx 这篇文章讲Javascript中的原型与继
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号