zoukankan      html  css  js  c++  java
  • js之重写原型对象

    “实例中的指针仅指向原型,而不是指向构造函数”。

    “重写原型对象切断了现有原型与任何之前已经存在的对象实例之间的关系;它们引用的仍然是最初的原型”。——前记 

    var fun = function(){}
    fun.prototype = {    
        name : 'peter',    
        age : 25    
    }
    var a = new fun();
    var b = new fun();
    console.log(a.name, b.name);//peter peter
    fun.prototype.name = 'jack';
    console.log(a.name, b.name);//jack jack
    fun.prototype = {};
    fun.prototype.name = 'tom';
    console.log(a.name, b.name); //jack jack
    console.log('1',b.constructor === fun)  //1 false
    console.log('2',b instanceof fun)  //2 false
    b.constructor.prototype.name = 'kitty'; //b.constructor.prototype指向的是fun的prototype
    console.log(a.name, b.name); //jack jack
    
    //如何修改a和b的name是tom?
    a.__proto__.name = 'tom';
    console.log(a.name,b.name)

      

    上面的b.constructor指向的是构造函数,但是如果构造函数原型被重写,b.constructor !== fun了,原因是指针指向的其实是原型对象。所以:实例化对象的constructor对象不是任何时候都指向构造函数本身,除非构造函数的原型一直不变,如果构造函数原型重写,全等关系就破灭了。

    可以看出,实例在原型修改前后的不同,实例只继承实例化之前的原型,可以修改属性值,但是如果重写,那么实例化对象的指针__proto__指向的还是以前的原型对象,如果想要重写实例的原型,则需要修改实例化对象的__proto__属性值了。

    【完】

    The normal,they make me feel afraid

    The crazy, they make me feel sane

  • 相关阅读:
    笔试题-同线程Lock语句递归不会死锁
    EnterWriteLock与lock有啥区别?
    lock(this)其实是个坑
    实际项目中关于ManualResetEvent的用法
    以1个实例讲解ManualResetEvent的作用
    Session有什么重大BUG,微软提出了什么解决方案
    Session和Cookie实现购物车
    VMware打开虚拟机黑屏
    idea使用java整合ice
    elasticsearch基本概念
  • 原文地址:https://www.cnblogs.com/tangjiao/p/9910185.html
Copyright © 2011-2022 走看看