原文出自于本人个人博客网站:https://www.dzyong.com(欢迎访问)
转载请注明来源: 邓占勇的个人博客 - 《JavaScript设计模式(2)—— 多种继承方式的实现及原理》
本文链接地址: https://www.dzyong.com/#/ViewArticle/88
设计模式系列博客:JavaScript设计模式系列目录(持续更新中)
在JavaScript中继承是依赖于原型prototype链实现的,只有一条原型链,理论上是不能继承多个父类的。然而JavaScript是灵活的,可以通过一些特殊的技巧继承多个对象的属性来实现类似的多继承。
在讲解多继承之前,先说一下继承单对象属性的extend方法。
单继承
//单继承 属性复制
let extend = function(target, source){
//遍历源对象中的属性
for (const property in source) {
//将源对象中的属性复制到目标对象中
target[property] = source[property]
}
return target
}
extend方法是实现就是对对象中的属性进行复制的过程。但是它是一个浅复制过程,它只能复制值类型的属性,对于运用类型的属性它无能为力。
多继承
let mix = function(){
var i = 1,
len = arguments.length,
target = arguments[0]
arg;
for (; i < len; i++) {
//缓存当前对象
arg = arguments[i]
for (const property in arg) {
target[property] = arg[property]
}
}
return target
}
mix 方法的作用就是将传入的多个对象的属性的值到源对象中,这样就实现对多个对象属性的继承。但是必要要注意一点,第一个参数才是需要继承的对象。我们可以把这个方法绑定到原生object上,这样所有的对象就是可以拥有这个方法了。
Object.prototype.mix = function(){
let i = 0,
len = arguments.length,
arg;
for (; i < len; i++) {
arg = arguments[i]
for (const property in arg) {
this[property] = arg[property]
}
}
}
使用起来就更加的方便
book.mix(otherBook)
多态
多态,就是同一个方法多种调用方式。早JavaScript中,通过对传入的参数做判断来实现。
如我们定义个add方法,如果不传参数则返回10,传入一个参数返回该数平方,传入两个参数时返回两个数之和。
let add = function(){
var len = arguments.length
switch(len){
case 0:
return 10
case 1:
return Math.pow(arguments[0], 2)
case 2:
return arguments[0] + arguments[1]
}
}