原型与继承
一、原型和原型链
- 每个对象都拥有一个原型对象prototype
- 通过new 操作创建一个对象的实例,实例内包含指向对象原型的指针,使用proto属性来表示,如:
- 创建一个对象var a ={}(相当于是var a = new Object({})),那么a.proto指向Object.prototype
- 创建一个构造函数F及其实例
- f1 是F的一个实例,包含原型指针proto属性,指向F.prototype
- F是构造函数,包含原型F.prototype对象:
- F.prototype.constructor指向F构造函数本身;
- F.prototype对象又是Object的一个实例,所以F.prototype.proto原型指针指向Object原型;
- Object.prototype.constructor指向Object对象本身;
- Object.prototype.proto原型指针指向null
- 原型支持修改、重写
- proto并不是规范中的属性,可以使用Object.getPrototypeof(obj)方法来获取对象的原型
- 原型链是指:对象的原型还有原型,一直找到原型链的尽头null,也就是Object.prototype.proto===null
- hasOwnProperty()方法来判断属性是否是原型链上的属性
二、原型、proto、构造函数三者关系
三、对象继承的方式
- 继承其实就是一个对象能使用另一个对象的属性/方法
- 实现继承的方式:通过原型——只要一个对象在另一个对象的原型链上
- 使用new操作对象
- B使用call/apply调用构造函数A,再指定B.prototype
- 使用Object.create()
- ES6的class ... extends + super()方法
四、如何获得对象非原型链上的属性?
for(var key in obj) {
if(obj.hasOwnProperty(key)) {
// ...
}
}