JS继承方式

1、原型链继承

将子类型的prototype属性指向父类型的实例实现继承。

例:

缺点:若父类型原型的属性为引用类型属性时,会导致不论是哪个实例操作原型属性均会影响另一个实例,并且,在创建子类型实例时,不能像超类型的构造函数中传递参数

如上,给instance1的name属性添加了anna值,结果导致instance2的name属性值也发生了改变。

2、借用构造函数

为解决以上问题,可以使用call或apply来调用构造函数,临时改变this值达到继承目的。

例:

以上的注释部分SuperType.call(this,name)等同于this.newName=SuperType与this.newName(name);很明显,每个实例都可以通过参数传入独立的属性值,不论是哪个实例改变了color属性,都不会影响其他的实例。

缺点:无法共享父类型的prototye属性中的属性和方法

3、组合继承(原型链+借用构造函数)

这种方法既可以防止引用类型属性被任一实例修改,也可以使所有实例共享父类型的prototye属性中的属性和方法 

例: 

缺点是:当子类型的prototype属性指向父类型的实例时,已经继承了父类型的属性,只不过对于引用类型而言不论哪个实例操作原型属性均会影响另一个实例,而在子类型的构造函数内调用父类的构造函数时,会覆盖从原型中继承来的父类型的属性,多余,但不会相互影响

4、原型式继承

需要提供一个父对象作为原型对象

例:

 

5、寄生式继承

例:

6、寄生组合式继承

解决组合继承的缺点,最理想的继承方式

例:

注意:重写原型,因为重写原型会导致SubType原型的constructor的属性为SuperType,该做法将将属性重新指定为SubType,即prototype.constructor=SubType。

7、ECMA5提供了继承的方法

1) Object.setPrototypeOf(子对象,父对象)
2) Object.create(父对象)

posted @ 2017-01-03 22:50  jefferyE  阅读(244)  评论(0编辑  收藏  举报