多继承
javascript中继承是依赖于原型prototype链实现的,只有一条原型链,所以理论上是不能实现多继承多个父类的,但是javascript是灵活的,通过一些技巧就可以实现继承多个对象的属性来类似的实现多继承。
下面是一个实现单继承的方法extend:
//单继承 属性复制
var extend = function(target,source){
//遍历源对象的属性
for(var property in source){
//将源对象的属性复制到目标对象中
target[property] = source[property];
}
//返回目标对象
return target;
}
var book = {
name: 'js book',
alikebook: ["css book", 'html book']
};
var books = {
color: 'red'
};
extend(books, book);
console.log(books.name);//js book
console.log(books.alikebook);//["css book", 'html book']
</script>
extend方法的实现就是对对象中的属性的一个复制过程,同样的道理,我们也可以实现多继承:
//多继承
var mix = function(){
var i = 1,//从第二个参数起被继承的对象
len = arguments.length,//获取参数长度
target = arguments[0],//第一个对象为目标对象
arg;//缓存参数对象
//遍历被继承的对象
for(; i < len; i++){
//缓存当前对象
arg = arguments[i];
//遍历被继承对象中的属性
for(var property in arg){
//复制
target[property] = arg[property];
}
}
//返回目标对象
return target;
}
var book = {
name: 'js book',
alikebook: ["css book", 'html book']
};
var books = {
color: 'red'
};
extend(books, book);
console.log(books.name);//js book
console.log(books.alikebook);//["css book", 'html book']
当然,我们还可以将他绑定到原生对象Object上,这样所有的对象就可以拥有这个方法了。
Object.prototype.mix = function(){
var i = 1,//从第二个参数起被继承的对象
len = arguments.length,//获取参数长度
target = arguments[0],//第一个对象为目标对象
arg;//缓存参数对象
//遍历被继承的对象
for(; i < len; i++){
//缓存当前对象
arg = arguments[i];
//遍历被继承对象中的属性
for(var property in arg){
//复制
this[property] = arg[property];
}
}
//返回目标对象
return target;
}
多态
多态就是同一个方法多种调用方式。在javascript中也可以实现,只不过要对传入的参数做判断以实现多种调用方式:
//多态
function Add(){
//无参数算法
function zero(){
return 10;
}
//一个参数算法
function one(num){
return 10 + num;
}
//两个参数算法
function two(num1, num2){
return num1 + num2;
}
//相加共有方法
this.add = function(){
var arg = arguments,
//获取参数长度
len = arg.length;
switch (len){
//如果没有参数
case 0:
return zero();
case 1:
return one(arg[0]);
case 2:
return two(arg[0],arg[1]);
}
}
}
//实例化类
var A = new Add();
console.log(A.add());//10
console.log(A.add(5));//15
console.log(A.add(10,3));//13