zoukankan      html  css  js  c++  java
  • 神秘链接__proto__是什么鬼

    _proto_实际上是某个实例对象的隐藏属性,而prototype是其构造器函数(或者说‘类’)的原型属性;

    function Mine() {}

     var  hi = new Function(),

           ha = new Object(),

          me = new Mine();

    由构造器函数创建的实例对象,也就是用new Function(),new Object(),new Mine()等方法创建的实例对象都有一个隐藏的内部属性,__proto__指向其构造器原型prototype的引用 ,也就是   实例.__proto__ = 构造器.prototype

    实例对象和构造器之间通过这个隐藏属性实现通信连接

    而其构造的原型又有一个__proto__属性   构造器.prototype.__proto__ = 构造器的构造器.prototype

    一直往上找

    构造器的构造器.prototype.__proto__  = 构造器的构造器的构造器.prototype;

    ...(假设该构造器是由父构造器一层一层构造出来的,实际可能只有一两层)

    构造器的构造器的构造器.prototype.__proto__ == Function.prototype;

    Function.prototype.__proto__ = Object.prototype;

    Object.prototype.__proto__ = null;

    结束了

    function Mine(){
      console.log(this.constructor)
    }

    var obj = new Mine();

    obj.__proto__ == Mine.prototype;//true

    console.log(obj.__proto__) // Mine {} 一个空的普通原型对象

    obj.__proto__  == Mine //false 说明实例对象的原型链引用是指向其构造的原型属性的而不是直接指向构造器本身的

    Mine.prototype.__proto__ == Object.prototype //true

    Object.prototype.__proto__ == null;//true

    Mine.prototype.__proto__ == Function.prototype //false

    var objA = { name:"Mack",sex:'male' };
    function Human(){};
    Human.prototype=objA;

    在还没有实例化之前我们调用Human.__proto__会得到什么呢?

    Human.__proto__//function () {}  

    var designer=new Human();
    designer.name="Jo";
    designer.age="26";

    现在我们来访问新建对象designer的属性,
    designer.name//Jo
    designer.age//26

    这是新建对象本身就有的属性,当然我们也可以访问designer从其构造器函数那里继承来的属性。


    designer.sex;//male;
    加载机制,首先会在自身属性中找,没找到就去其原型中找,就好像有一个神秘的链接指向了相关的"原型对象";

    //这里有歧义

    designer.__proto__== (Human.prototype) == objA;//true; 

    designer.__proto__== new Human().prototype;//true; 

    designer.__proto__== Human.prototype;//true

    what's the fuck?都尼玛为true,好忧伤的定义啊 


    _proto_实际上是某个对象实例的属性,而prototype这是其构造器函数的属性,或者说类的原型属性,所以两者并不等价;

    typeof designer.__proto__;

    //object;


    typeof designer.prototype;

    //undefined;实例对象没有原型属性 所以输出未定义

     

    designer.constructor //  ????


    typeof designer.constructor.prototype;
    //object

  • 相关阅读:
    BFS(双向) HDOJ 3085 Nightmare Ⅱ
    BFS+Hash(储存,判重) HDOJ 1067 Gap
    BFS(判断状态) HDOJ 3533 Escape
    三进制状压 HDOJ 3001 Travelling
    BFS(八数码) POJ 1077 || HDOJ 1043 Eight
    Codeforces Round #332 (Div. 2)
    BFS HDOJ 2102 A计划
    if语句
    shell脚本编程测试类型下
    shell脚本编程测试类型上
  • 原文地址:https://www.cnblogs.com/Aladingding/p/4618079.html
Copyright © 2011-2022 走看看