原型 / 构造函数 / 实例/原型链
原型( prototype ): ⼀个简单的对象,⽤于实现对象的 属性继承。可以简单的理解成对象 的爹。在 Firefox 和 Chrome 中,每个 JavaScript 对象中都包含⼀个
proto (⾮标准)的属性指向它爹(该对象的原型),可 obj.proto 进⾏访问。 构造函数: 可以通过 new 来 新建⼀个对象 的函数。 实例: 通过构造函数和 new 创建出来的对象,便是实例。 实例通过 proto 指向原
型,通过 constructor 指向构造函数。
以 Object 为例,我们常⽤的 Object 便是⼀个构造函数,因此我们可以通过它构建实例。
// 实例
//const instance = new Object()
//
const instance = new Object()
则此时, 实例为 instance , 构造函数为 Object ,我们知道,构造函数拥有
⼀个 prototype 的属性指向原型,因此原型为:
// 原型
//
const prototype = Object.prototype
实例.proto === 原型 原型.constructor === 构造函数 构造函数.prototype === 原型
//
// 这条线其实是是基于原型进⾏获取的,可以理解成⼀条基于原型的映射线
// 例如:
const o = new Object()
o.constructor === Object --> true
o.__proto__ = null;
o.constructor === Object --> false
实例.constructor === 构造函数
另外提一下原型链:
原型链: 原型链是由原型对象组成,每个对象都有 proto 属性,指向了创建该对 象的构造函数的原型, proto 将对象连接起来组成了原型链。是⼀个⽤ 来实现继承和共享属性的有限的对象链 属性查找机制: 当查找对象的属性时,如果实例对象⾃身不存在该属性,则沿着原型链往上 ⼀级查找,找到时则输出,不存在时,则继续沿着原型链往上⼀级查找,直⾄最顶级的原 型对象 Object.prototype ,如还是没找到,则输出 undefined ; 属性修改机制: 只会修改实例对象本身的属性,如果不存在,则进⾏添加该属性,如果需要 修改原型的属性时,则可以⽤: b.prototype.x = 2 ;但是这样会造成所有继承于该对象 的实例的属性发⽣改变。