原型和原型链
原型
实例对象共享的属性和方法,可以抽离出来放在一个对象中,这个对象就是原型对象。
- 构造函数中,使用 prototype 指向原型对象
- 实例对象中,使用 proto 指向原型对象
- 原型对象中,使用 construct 指向构造函数
- 实例对象中,使用 construct 指向构造函数
1 | function Person(name) { |
instanceof: 用于检测构造函数的原型对象是否出现在某个实例对象的原型链上
1 | console.log(p1 instanceof Person); // true |
操作原型的方法:
- Object.create: 根据指定的原型对象创建新对象。Object.create(proto, [propertiesObject])
- Object.getPrototypeOf: 获取一个对象的原型。Object.getPrototypeOf(obj)
- Object.setPrototypeOf: 设置一个对象的原型。Object.setPrototypeOf(obj, prototype)
- Object.prototype.isPrototypeOf(): 返回一个布尔值,表示指定的对象是否在本对象的原型链中。
1 | // 操作原型的方法 |
实例、原型对象、构造函数关系图:
原型链
定义:
每一个对象都包含一个原型属性,用于关联另一个对象,关联后就能够使用那个对象的属性和方法;对象之前通过原型关联在一起,就好比一条锁链将一个个对象连接在一起,最终形成了一条原型链。
属性查找机制:
当查找对象属性时,如果实例对象自身不存在该属性,就从原型链往上一级查找,如果还没找到就再往上一级,直至最顶级的原型对象 Object.prototype,如果还没找到则返回 undefined