原型
什么是原型?
每个函数都有一个 prototype 属性,这个属性就是原型,它指向一个对象,也叫原型对象。
每个通过构造函数创建的对象,都有一个 __proto__ 属性,指向其构造函数的 prototype 。
原型对象本质上也是对象,也会有 __proto__ 属性,也就是说原型对象也有原型对象。
当访问对象属性时,如果自身没有,就会沿着 __proto__ 向上查找,直到 null,这条链条就是原型链。
原型的作用
多个对象共享原型上的属性和方法,节省内存,性能优化。
通过原型链实现对象间的继承关系。
构造函数
只能说绝大多数对象都是通过构造函数创建的,但不是所有
new Object()、new Array()、new Person()等显式构造函数调用- 字面量
{}、[]、/regex/— 引擎会隐式调用Object()、Array()、RegExp()构造函数 class定义 — 本质也是构造函数
所以更准确的表述是:所有对象都通过内部机制创建,其中绝大多数会关联一个原型对象,而这个原型通常来自某个构造函数。
除了 Object.create(null) 这种刻意“切断原型”的对象外,其他所有对象本质上都源于某个构造函数。