原型链继承
创建:
创建一个函数,将这个函数作为
构造函数,并向构造函数的原型上添加属性、方法。
继承:
把new 上面
构造函数出来的这个实例放在承接者的原型上。
缺点:
多个实例对构造函数内的引用(this)属性进行操作时,会导致构造函数内的属性发生变化,从而影响其他继承该函数的使用
构造函数继承
创建:
创建一个函数,将这个函数作为
基础函数,并向构造函数上添加属性、方法。 继承: 创建一个函数,将这个函数作为构造函数,把构造函数的this用call方法指向基础函数。
创建函数来承接 new上面的构造函数,相当于每个承接者即实例都通过上面的this调用,复制了一份基础函数。 等同于复制父类的实例给子类 缺点: 只能继承父类(基础函数)实例的属性和方法,不能使用基础函数的原型。
无法实现复用,每个子类都有父类实例函数的副本,影响性能
组合式继承
创建和使用为上面两者结合起来 优点:
实例对象
instance1上的两个属性就屏蔽了其原型对象SubType.prototype的两个同名属性。 缺点: 组合模式的缺点就是在使用子类创建实例对象时,其原型中会存在两份相同的属性/方法。
原型继承
创建:
创建一个函数,里面创建一个空函数,然后将一个对象挂载到这个空函数上的
prototype,这个对象中包含你所想要的属性和方法,最后return出这个函数去。 使用: 调用上面的函数,返回里面的挂载对象的空函数 缺点: 原型链继承多个实例的引用类型属性指向相同,存在篡改的可能。
无法传递参数
寄生式继承
创建:
在原型式继承的基础上,创建一个函数,在函数中创建变量,用原型式的方法继承给变量,想这个变量中添加方法和属性,最后返回变量(即加强过的函数)。 继承: 使用上面创建的函数,返回一个函数,承接者可以使用对象中的属性和方法,包括上面加强的方法 缺点: 同上
寄生组合式继承
- 父类初始化实例属性和原型属性
- 子类初始化,并借用构造函数传递增强子类实例属性(支持传参和避免篡改)
- 将子类原型指向父类原型,并修复因重写原型而失去的默认的constructor 属性
- 新增子类原型属性
Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。 (请打开浏览器控制台以查看运行结果。)
混入方式继承多个对象
-
父类初始化实例属性和原型属性
-
子类初始化,并借用构造函数传递增强子类实例属性(支持传参和避免篡改)
-
将子类原型指向一个父类原型,在子类原型通过Object.assign复制其他父类的属性,修复因重写原型而被修改的默认的constructor 属性
-
新增子类原型属性
ES6类继承extends
原文:链接:juejin.cn/post/684490…