基本原则:

1:所有对象的构造函数是Object(),用于创建prototype(原型对象);
2: 所有方法(方法也是对象,可以叫方法对象)的构造函数是Function(),用于创建函数;
3: 任何对象(普通对象/函数)具有隐形继承属性proto ,且指向当前实例的构造函数的原型对象;
4: 普通对象只有隐形继承属性proto

通过分析案例来解释上述原则:

案例

声明函数

  1. function foo(){}
  2. /*
  3. 使用2、3来解释。
  4. foo方法对象是由Function来实例化,且foo.__proto__ 指向Function.prototype
  5. */
  6. console.assert( foo.__proto__ === Function.prototype)
  7. /*
  8. 使用2、3来解释。
  9. foo方法对象的属性prototype是由Object来实例化,且foo.prototype.__proto__指向Function.prototype
  10. */
  11. console.assert( foo.prototype.__proto__ === Object.prototype)

内置构造函数

  1. // 道理同上
  2. console.assert( Array.__proto__ === Function.prototype)
  3. console.assert( Array.prototype.__proto__ === Object.prototype)
  4. console.assert( Boolean.__proto__ === Function.prototype)
  5. console.assert( Boolean.prototype.__proto__ === Object.prototype)
  6. console.assert( Number.__proto__ === Function.prototype)
  7. console.assert( Number.prototype.__proto__ === Object.prototype)

特例:

由于Object和Function是万物始祖,有其特殊性,所以以上两条原则不适用这两个对象。按浏览器设定为准,记住就行了。

Object本身是个方法对象,其挂载的方法和属性可以理解为它的静态方法或静态属性。
可以通过Object.xxx来调用。
1.png
Object.prototype
Object.prototype 是浏览器底层根据 ECMAScript 规范创造的一个对象,它就是原型链的顶端
Object.prototype.proto == null1.png
Function本身是个方法对象,其挂载的方法和属性可以理解为静态方法或静态属性
1.png

以下三个属性指向同一个方法对象, 虽然是方法对象,但是没有prototype属性。(箭头函数也是只有protyo,没有prototype属性)
Object.__proto__
Function.__proto__
Function.prototype
1.pngObject.proto.proto === Function.proto.prototype === Function.prototype.proto === Object.prototype
Object.proto 和 Function.proto 和 Function.prototype 指向的对象是由Object构造器生成的。