Function和Object的关系

Function和Object的关系 

 借别人的图,借用里面的例子,声明了一个构造函数Foo,通过构造函数Foo声明了一个f1实例,以下记录自己的分析理解。

 这两条线比较乱,要是绕的脑子乱了跳过就好。

主线:(从f1实例到null是一条笔直的链条)

  f1继承自构造函数Foo的显式原型Foo.prototype:f1.__proto__ ——> Foo.prototype

  Foo.prototype继承自Foo函数的构造函数Object的原型Object.prototype:Foo.prototype.__proto__  ——> Object.prototype

  Object.prototype继承自null:Object.prototype.__proto__ ——> null

支线:(Foo和Object指向Function,Function再转回主线)

  Object对象继承自他的构造函数Function

  Foo构造函数继承自他的构造函数Function

  Function函数继承自他自己的原型Function.prototype

  Function.prototype继承自对象的原型Object.prototype

 总结线路内容:(我要自己把自己绕傻了)

1.  Object对象有Function的原型方法,但是没有Function上的方法

    Object.__proto__ === Function.prototype

2.  Function构造函数有Object对象的原型方法,但是没有Object对象上的方法

    Function.prototype.__proto__  ||  Function.__proto__.__proto__ === Object.prototype  

3.  Function构造函数继承自他自己的显式原型(为什么要这样设计?)

    Function.__proto__ === Function.prototype

4.  我把Function和Object当做同一级的两个内容设定,我的理解是,Function是Object的直接扩展,Object是Function的次要扩展(根据1和2的式子推断)。Object直接继承Function的显式原型,Function间接继承Object显式原型。

5.  Object和Function互相instanceof 都为 true,也就是说Object和Function互为实例

 真正的总结

1. 我理解原型链要分为4层:

    • 第一层 实例层 f1
    • 第二层 构造函数层 Foo
    • 第三层 对象和函数层 Object和Function 这两个玩意是所有对象和函数的爸和妈
    • 第四层 null层 以太,一切的起点

2. 正常情况下,原型链上所有的对象都是继承自他的构造函数的显式原型,也就是说如 f1.__proto__  ——> Foo.prototype

3. 特例,当某个对象的显式原型的构造函数是他自己时,他的显式原型就去继承Object对象的显式原型,比如说 Foo.prototype.__proto__ ——> Object.prototype。

  而Object的显式原型对象则会继承null。 Object.prototype.__proto__ ——> null

4. 所有的构造函数方法,都是Function构造函数提供的,也就是说,所有有构造函数的对象都是继承自Function的,Function自己没有构造函数,或者说他是他自己的构造函数(他就是构造函数,构造函数就是他,他是一切构造函数的源头,他是万恶之源,他用自己继承了自己)。

5. 我不知道我说的对不对,说错了别打我。

Function和Object的关系

图片来源JavaScript中显式原型和隐式原型的联系https://www.cnblogs.com/liubinghaoJavaScript/p/7478432.html