• 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

     

  • 相关阅读:
    AtCoder Beginner Contest 162 C~F
    题解 | 【CF896B】 Ithea Plays With Chtholly
    C# | C#快速入门
    Codeforces Round #618 (Div. 2) A~E
    Educational Codeforces Round 92 (Rated for Div. 2) A~C
    使用 Python 参与算法竞赛
    【网络爬虫学习】实战,爬取网页以及贴吧数据
    国内pip源提示“not a trusted or secure host”解决方案
    【网络爬虫学习】第一个Python爬虫程序 & 编码与解码详解 & Pythonの实现
    【网络爬虫学习】网页的基本构成
  • 原文地址:https://www.cnblogs.com/oxspirt/p/6069874.html
Copyright © 2020-2023  润新知