规则:

    1. 所有引用类型(对象,数组,函数)都具有对象特性,即可以自由扩展属性
    2. 所有引用类型(对象,数组,函数)都具有一个proto(隐式原型/原型链属性)属性,是一个普通对象
    3. 所有的函数都具有prototype(显式原型)属性,也是一个普通对象
    4. 所有引用类型(对象,数组,函数)proto指向它构造函数的prototype
      1. function Test() {}
      2. const test = new Test();
      3. test.__proto__ === Test.prototype; //true
      构造函数拥有**prototype**属性,对象实例拥有__proto__属性,他们都是用来访问原型对象的。
      同时,因为函数不仅是函数,还是个对象,所以它有__proto__属性。
      因为函数是内置构造函数Function的实例
      1. const fn = new Funtion('Fun test');
      2. fn.__proto__ === Function.prototype // true
    • 所有的内建对象都遵循相同的模式(pattern):
      • 方法都存储在 prototype 中(Array.prototypeObject.prototypeDate.prototype 等)。
      • 对象本身只存储数据(数组元素、对象属性、日期)。
    • 字符串、数字和布尔值并不是对象。当试图访问它们的属性,那么临时包装器对象将会通过内建的构造器 StringNumberBoolean 被创建。它们提供给我们操作字符串、数字和布尔值的方法然后消失。
      • 原始数据类型也将方法存储在包装器对象的 prototype 中:Number.prototypeString.prototypeBoolean.prototype
    • undefinednull 没有包装器对象。
      • 特殊值 nullundefined 比较特殊。它们没有对象包装器,所以它们没有方法和属性。并且它们也没有相应的原型。

    Function.proto === Function.prototype
    true
    **
    函数数据类型:
    普通函数、类(内置类【Object、Array、Function、Date…】、自定义类)、箭头函数 都是Function的实例
    Object.proto===Array.proto === Function.proto —> Function.prototype
    Function.prototype.
    proto__ === Object.prototype
    对象数据类型:
    普通对象、实例对象、原型对象(Prototype) 都是Object的实例
    image.png
    在JS的任何实例(任何值【除了值类型的值】)最后都可以基于自己的proto找到Object.portotype,
    所有的内建原型顶端都是 Object.prototype。这就是为什么有人说“一切都从对象继承而来”。
    image.png