• js中Object.__proto__===Function.prototype


    参考:http://stackoverflow.com/questions/650764/how-does-proto-differ-from-constructor-prototype

    http://blog.rainy.im/

     

     

    __proto__ is the actual object that is used in the lookup chain to resolve methods, etc. prototype is the object that is used to build __proto__ when you create an object with new:

    ( new Foo ).__proto__ === Foo.prototype
    ( new Foo ).prototype === undefined

    The most surprising thing for me was discovering that Object.__proto__ points to Function.prototype, instead of Object.prototype, but I'm sure there's a good reason for that :-)

    I think the class Object itself is an instance of Function, that's why Object.__proto__ === Function.prototype.

    The reason why Object.__proto__ points to Function.prototype is because Object() by itself is a native function that instantiates an empty object. Therefore, Object() is a function. You'll find that all the other major native types' __proto__ properties point to Function.prototypeObjectFunctionStringNumber, and Array all inherit the Function prototype.

    This means that adding to Function.prototype will automatically reflect on all objects whose __proto__ is referencing the Function.prototype.

    For example, look the map below:

    Furthermore, even the class Function itself is an instance of Function itself, that is Function.__proto__ === Function.prototype, that's also why Function === Function.constructor

    Further furthermore, the regular class Cat is an instance of Function, that is Cat.__proto__ === Function.prototype.

    The reason for the above is, when we create a class in JavaScript, actually, we are just creating a function, which should be an instance of FunctionObject and Function are just special, but they are still classes, while Cat is a regular class.

    As a matter of factor, in Google Chrome JavaScript engine, the following 4:

    • Function.prototype
    • Function.__proto__
    • Object.__proto__
    • Cat.__proto__

    They are all === (absolutely equal) to the other 3, and their value is function Empty() {}

    > Function.prototype
      function Empty() {}
    > Function.__proto__
      function Empty() {}
    > Object.__proto__
      function Empty() {}
    > Cat.__proto__
      function Empty() {}
    > Function.prototype === Function.__proto__
      true
    > Function.__proto__ === Object.__proto__
      true
    > Object.__proto__ === Cat.__proto__
      true

    prototype-chain

     

  • 相关阅读:
    python爬虫基础(requests、BeautifulSoup)
    python中字典按键、值进行排序
    进程和线程的区别
    MySQL中的索引
    python中浅拷贝和深拷贝的区别
    谈谈final、finally、finalize的区别
    python中布尔值是false
    生成器的阐释
    文件处理
    内置函数
  • 原文地址:https://www.cnblogs.com/oxspirt/p/6069874.html
Copyright © 2020-2023  润新知