ES5新增了Object.create()方法,这个方法规范化了原型式继承。这个方法我在这里不多介绍,感兴趣的小伙伴可以参考MDN的说明文档
原型式继承优点如果只想让一个对象与另外一个对象保持类似的情况下,原型式继承可以完全胜任。
原型式继承缺点原型式继承的缺点相信各位小伙伴们已经看出来了,包含引用类型值的属性始终都会共享相应的值,就像使用原型链继承一样。
5.寄生式继承 寄生式继承的概念寄生式(parasitic)继承是与原型式继承紧密相关的一种思路,即创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再返回对象。
废话不多说,让我们来看下面这段代码。
function createAnother(original) { const clone = Object.create(original); clone.sayHi = function() { console.log('hi'); } return clone; } const person = { name: 'zhangsan', cars: ['奔驰', '宝马', '兰博基尼'] } const anotherPerson = createAnother(person); anotherPerson.sayHi(); //'hi' const yetAnotherPerson = createAnother(person); yetAnotherPerson.sayHi(); //'hi' console.log(anotherPerson.sayHi == yetAnotherPerson.sayHi) //false这个例子中,封装了一个createAnother的函数,这个函数接收一个参数,也就是将要作为新对象的基础对象,我们可以看到,anotherPerson和yetAnotherPerson两个对象拥有各自的sayHi方法。
在主要考虑对象而不是自定义类型和构造函数的情况下,寄生式继承也是一种有用的模式。
寄生式继承优点继承的对象都拥有各自的属性和方法(引用类型)。
寄生式继承缺点使用寄生式继承来为对象添加函数,会由于不能做到函数复用而降低效率,这一点与构造函数继承模式类似。
6.寄生组合式继承 寄生组合继承的概念所谓寄生组合式继承,就是通过构造函数来继承属性,通过原型链的混成形式来继承方法。其背后的基本思路是:不必为了指定子类型的原型而调用超类型的构造函数,我们所需的无非就是超类型原型的一个副本而已。
本质上,就是使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型。让我们来看下面这段代码。
function inheritPrototype(Son, Father) { const prototype = Object.create(Father.prototype); prototype.constructor = Son; Son.prototype = prototype; } function Father(name) { this.name = name; this.cars = ['奔驰', '宝马', '兰博基尼']; } Father.prototype.sayName = function() { console.log(this.name); } function Son(name, age) { Father.call(this, name); //调用Father this.age = age; } inheritPrototype(Son, Father); Son.prototype.sayAge = function() { console.log(this.age); }这个例子的高效率体现在它只调用了一次Father构造函数,并且因此避免在Son.prototype上面创建不必要、多余的属性。
寄生组合式继承优点寄生组合式继承只调用了一次超类型构造函数,是被开发人员普遍认为是引用类型最理想的继承范式。
寄生组合式继承无缺点 总结前端的学习之路还有很长很长,这篇文章只不过是冰山一角,希望前端cc写的这篇文章能给小伙伴们带来新的知识拓展,愿前端cc与各位前端小伙伴们在前端生涯中一起共同成长,冲鸭!