规则:
- 所有引用类型(对象,数组,函数)都具有对象特性,即可以自由扩展属性
- 所有引用类型(对象,数组,函数)都具有一个proto(隐式原型/原型链属性)属性,是一个普通对象
- 所有的函数都具有prototype(显式原型)属性,也是一个普通对象
- 所有引用类型(对象,数组,函数)proto值指向它构造函数的prototype
构造函数拥有function Test() {}const test = new Test();test.__proto__ === Test.prototype; //true
**prototype**属性,对象实例拥有__proto__属性,他们都是用来访问原型对象的。
同时,因为函数不仅是函数,还是个对象,所以它有__proto__属性。
因为函数是内置构造函数Function的实例const fn = new Funtion('Fun test');fn.__proto__ === Function.prototype // true
- 所有的内建对象都遵循相同的模式(pattern):
- 方法都存储在 prototype 中(
Array.prototype、Object.prototype、Date.prototype等)。 - 对象本身只存储数据(数组元素、对象属性、日期)。
- 方法都存储在 prototype 中(
- 字符串、数字和布尔值并不是对象。当试图访问它们的属性,那么临时包装器对象将会通过内建的构造器
String、Number和Boolean被创建。它们提供给我们操作字符串、数字和布尔值的方法然后消失。- 原始数据类型也将方法存储在包装器对象的 prototype 中:
Number.prototype、String.prototype和Boolean.prototype。
- 原始数据类型也将方法存储在包装器对象的 prototype 中:
undefined和null没有包装器对象。- 特殊值
null和undefined比较特殊。它们没有对象包装器,所以它们没有方法和属性。并且它们也没有相应的原型。
- 特殊值
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的实例
在JS的任何实例(任何值【除了值类型的值】)最后都可以基于自己的proto找到Object.portotype,
所有的内建原型顶端都是 Object.prototype。这就是为什么有人说“一切都从对象继承而来”。
