多继承:
在 JavaScript 中的继承方式有很多种,比如 原型链继承,组合式继承,但其所有的继承都逃脱不了的是 prototype 来实现的很多继承往往都只能继承一个,继承多个的情况呢?
1、单个继承:
// 单个继承
let extend = function(target,source){
for(let p in source){
target[p] = source[p]
}
return target
}
就是将一个对象浅复制到另一个目标对象中
2、多继承:
let mix = function () {
let i = 1,
len = argument.length,
target = arguments[0]
arg;
for (; i < len; i++) {
arg = argument[i];
for (let p in arg) {
if (!hasOwnProperty.call(arg, p)) continue;
target[p] = arg[p];
}
}
return target
}
let actors = {
name: '李商隐',
movies: ['《北戴河》', '《杜陵花》']
}
let sub = mix(actors, { age: 45 })
console.log(sub) // { name: '李商隐', movies: [ '《北戴河》', '《杜陵花》' ], age: 45 }
也可以直接挂载在 Object 的原型上,则可以直接这样来写
Object.prototype.mix = function () {
let i = 0,
len = arguments.length,
arg;
for (; i < len; i++) {
arg = arguments[i];
for (let p in arg) {
if (!hasOwnProperty.call(arg, p)) continue;
this[p] = arg[p];
}
}
return this
}
let actors = {
name: '李商隐',
movies: ['《北戴河》', '《杜陵花》']
}
console.log(actors.mix({age:33})) // { name: '李商隐', movies: [ '《北戴河》', '《杜陵花》' ], age: 33 }
需要注意:这种多继承方式会导致后面的对象会将前面的对象相同的属性给重新赋值导致错误
多态:
所谓的多态也就是同一个方法中对不同的参数分别处理不同的逻辑,也是面向对象中最重要的一部分。JavaScript 中可以这样来处理
const add = function(){
let arg = arguments,
len = arguments.length;
switch (len) {
case 0:
// todo:
return 0;
case 1:
// todo:
return arg[0];
case 2:
// todo:
return arg[0] + arg[1];
default:
// todo:
return undefined;
}
}
console.log(add()) // 0
console.log(add(3)) // 3
console.log(add(3, 5)) // 8