1、原型链
ECMA-262 把原型链定义为 ECMAScript 的主要继承方式。其基本思想就是通过原型继承多个引用类型的属性和方法。
构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型有一个属性指回构造函数,而实例有一个内部指针指向原型。如果原型是另一个类型的实例,那就意味着这个原型本身有一个内部指针指向另一个原型,相应地另一个原型也有一个指针指向另一个构造函数。这样就在实例和原型之间构造了一条原型链。这就是原型链的基本构想。
/**
* 父类构造函数
* name 基础属性
* hobby 引用属性
* happy 原型方法
*/
function Parent(name) {
this.name = name;
this.hobby = ['basketball', 'ping-pang', 'reading'];
}
Parent.prototype.happy = function() {
console.log('go to happy');
}
/**
* 子类构造函数
*
*/
function Child(age) {
this.age = age;
}
// 将子类原型指向父类原型的实例
Child.prototype = new Parent;
console.log(Child.prototype.constructor) //同样构造函数被改为了 function:Parent
// 将子类构造函数重新指向Child
Child.prototype.constructor = Child;
let c1 = new Child(16);
let c2 = new Child(18);
//实例中的引用属性hobby是共享的,如果一个修改了,则其他的也会跟着修改
c1.hobby[0] = 'play game';
console.log(c1.hobby); // ['play LOL', 'ping-pang', 'reading']
console.log(c2.hobby); // ['play LOL', 'ping-pang', 'reading']
优点:
共享了父原型方法;
缺点:
不能向父构造函数传递参数;
子类实例共享父类的引用类型(例如:hobby属性);