JS继承

基于构造函数的继承
       call方法
      语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]])
      定义:调用一个对象的一个方法,以另一个对象替换当前对象。
      说明: call() 方法是与经典的对象冒充方法最相似的方法,它的第一个参数用作 this 的对象,其他参数都直接传递给函数自身。
       apply方法
       语法:apply([thisObj[,argArray]])
       定义:应用某一对象的一个方法,用另一个对象替换当前对象。
       说明:如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

       参考实例:

(function(){
	//生物
	function Biology(){
		this.isBeing = true ;
	}
	//动物
	function Animal(){
	}
	Animal.prototype = new Biology() ;
	
	function Cat(){
//		此种方式只是单纯属性的继承,Cat不是Animal的子类
		Animal.call(this);
	}
	
	var cat = new Cat() ;
//	验证Cat不是Animal的子类
	alert(cat instanceof Animal);
	alert("cat 是否具有Biology的属性 -> "+cat.isBeing);
	
	function Human(){
		
	}
//	Human继承自Animal类,是Animal的一个子类
	Human.prototype = new Animal() ;
	
	var human = new Human() ;
	
	alert(human instanceof Animal);
	alert("human 是否具有Biology的属性 -> "+human.isBeing);
	
})() ;

        不管是用call还是apply实现的继承,都是通过调用构造函数,改变执行构造函数的this对象,实现对象属性的填充。而当前类并不是父类的子类,并且不能继承父类原型中的属性和方法。


原型链方式的继承
       通过设置构造函数的prototype的对象实例,当前类具有父类及其原型类中的所有属性和方法,但是prototype的函数实例的构造函数中的参数必须是固定的。类似于Java面向对象的继承。

       参考实例

//使用原形链和构造函数的方式实现继承
(function(){
	Function.prototype.extend = function(parent){
//		添加一个中间类,避免原型被污染
		var MediumObj = function(){
		};
//		根据函数参数构造父类
		MediumObj.prototype = new parent(arguments[1]) ;
//		指定当前类的父类为MediumObj,这样如果this的实例化对象为父类添加或改变
//		属性首先是在MediumObj中对属性进行添加或修改,不影响parent,也就避免
//		修改parent的属性对this实例化对象的影响
		this.prototype = new MediumObj() ;
//		返回当前对象的构造函数
		return this ;
	};
//	父亲
	function Parent(name){
		this.name = name ;
		this.money = "1w" ;
	}
//	儿子,儿子不具有父亲的money,但是我们要实现父亲的money就是child的money
	function Child(name){
		this.name = name ;
	};
//	只有有父母的孩子才是宝
	var FullChild = Child.extend(Parent,"baba") ;
//	创建child实例
	var child = new FullChild("child");
//	child具有父亲的属性
	alert(child.name +"  "+child.money);
//	child是Child对象,也是Parent对象
	alert((child instanceof Child)+"    "+(child instanceof Parent));
})() ;

     在遍历类对象过程中,不仅会遍历对象的属性,也会遍历prototype中属性和方法。

 

你可能感兴趣的:(js)