摘要:冴羽的博客学习继承
原型链继承
通过原型链继承时不可以使用字面量创建原型方法,因为这样会重写原型链
1 | function Person() { |
注意:
1.引用类型的属性被所有实例共享
2.实例化子类Child时,无法向父类Person传参
借用构造函数(经典继承)
原理:在子类型构造函数的内部调用父类型构造函数。call、apply方法可以实现(模拟实现call、applay、bind和new)
1 | function Person(age) { |
注意:
1.引用类型的属性不会被所有实例共享
2.实例化子类Child时,可以向父类Person传参
3.方法都在构造函数中定义,每次创建实例都会创建一遍方法
组合继承
原型链继承+经典继承,原理:使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承
1 | function Person(age) { |
注意:通过在原型上定义方法实现了函数复用,又保证每个实例都有自己的属性,是js中最常用的继承方式
原型式继承
借助原型基于已有的对象创建对象,同时不必因此自定义类型。是Object.create的模拟实现
1 | function _create(o) { |
注意:
1.包含引用类型的属性值会共享
2.修改person1.name时,是给person1添加新的name属性,而非覆盖person的name属性
寄生式继承
创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,再返回对象
1 | function _create(o) { |
注意:每次创建对象都会创建一次方法
寄生组合式继承
寄生组合式继承是实现基于类型继承的最有效方式。只会调用一次父类型,避免了在父类型原型上创建多余的属性,同时原型链还保持不变。其本质上是使用寄生式继承来继承父类型的原型,然后再将结果指定给子类型的原型
1 | function Parent(name) { |
封装一下:
1 | function object(o) { |