• javascript读取和改动原型特别须要注意的事儿,由于原型的读写不具有对等性


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

  • 相关阅读:
    读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第三部分)
    Spring Boot进阶系列一
    职场进阶之七种武器
    大龄IT程序员的救赎之道
    Web Service
    生产者消费者问题
    SpringBoot集成Apache Shiro
    简单模拟医院叫号系统
    IT小团队管理者的突围之道
    内部推荐
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6860276.html
Copyright © 2020-2023  润新知