面向对象编程——多继承、多态

多继承

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
posted @ 2017-03-02 09:31  美美王子  阅读(337)  评论(0编辑  收藏  举报