YUI繼承 ,以及javascript中的繼承

YUI繼承源代碼, 這是YUI3.0用戶指南中的源代碼

Y.extend(Chicken, Bird); 實現Chicken繼承Bird,但是首先要有 Chicken,Bird 兩的函數定義

 

function Bird(name) {
    this.name = name;
} 
Bird.prototype.flighted   = true;  // Default for all Birds
Bird.prototype.isFlighted = function () { return this.flighted };
Bird.prototype.getName    = function () { return this.name };
 
function Chicken(name) {
    // Chain the constructors
    Chicken.superclass.constructor.call(this, name);
}
// Chickens are birds
Y.extend(Chicken, Bird);
 
// Define the Chicken prototype methods/members
Chicken.prototype.flighted = false; // Override default for all Chickens


其實通過前面一篇文章的分析,我發現YUI對繼承和拓展的搞法過於“迂腐”

前面我分析,javascript世界都是對象,另外,我們把函數的定義看作是“類對象”

所以:“類對象” 繼承的實現方式應該是非常的直接,用 = 就行了啊

看實例:

 

<script type="text/javascript">

function Classx(namexxx){
	
	this.structrue = function(_name){  //定義一個structrue函數
		this.name = _name;
	};
	this.name = "";
	
	this.structrue(namexxx);  //讓structrue函數的構造充當obj的構造
}

//obj1是obj類的實例
var obj1 = new Classx("2222"); 
//alert(obj1.name);   //alert("2222");

//繼承Classx,直接用對象賦值難道不好啊,感覺更直接
var ExtendsClassx = Classx;
ExtendsClassx.prototype.aNewMethod = function(){
	alert(this.name);
};
var objex = new ExtendsClassx("fff");
objex.aNewMethod();  //alert("fff")
alert(objex.name); //alert("fff");


obj1.aNewMethod();  //alert("2222");
alert(obj1.name); //alert("2222");
	
</script>


 蛋.....上面的例子 obj1,aNewMethod()也執行了,說明用 ExtendsClassx = Classx  是引用,我們需要複製對象,

對源碼繼續改進

 

//搞個對象複製的函數
	function copy(target,resource){
		for(e in resource){
			target[e] = resource[e];
		}
	}

	function Classx(namexxx) {

		this.structrue = function(_name) { //定義一個structrue函數
			this.name = _name;
		};
		this.name = "";

		this.structrue(namexxx); //讓structrue函數的構造充當obj的構造
	}

	//obj1是obj類的實例
	var obj1 = new Classx("2222");
	alert(obj1.name);   //alert("2222");

	var ExtendsClassx = function(namexxx){};

	copy(ExtendsClassx,Classx); //複製對象,不用 =

	ExtendsClassx.prototype.aNewMethod = function() {
		alert(this.name+"ffd");
	};
	var objex = new ExtendsClassx("fff");
	objex.aNewMethod(); //alert("und + ffd"),函數參數“fff”找不到,但是函數能執行
	alert(objex.name); //alert("fff");
	
	alert(obj1.name); //alert("2222");
	obj1.aNewMethod(); //alert("2222");//不能執行,說明ExtendsClassx 拓展了 Classx


這個對象具體要如何才能複製好,需要研究下,

看來YUI的這個extends很好的做到了複製這一點,所以YUI還行,而不僅僅是繁瑣, 哈哈!

 

javascript自身貌似很好的解決了對象的複製以及對象的拓展,我真的很想知道javascript是如何完全克隆的

call()函數,

感覺上call和我寫的copy應該是一致的,都在做對象的複製,只不過他考慮了函數的“參數”問題,而我還不知道如何解決

 

	function Classx(namexxx) {

		this.structrue = function(_name) { //定義一個structrue函數
			this.name = _name;
		};
		this.name = "";

		this.structrue(namexxx); //讓structrue函數的構造充當obj的構造
	}

	//obj1是obj類的實例
	var obj1 = new Classx("2222");
	alert(obj1.name);   //alert("2222");

	var ExtendsClassx = function(namexxx) {
		Classx.call(this, namexxx);
	};
	

	ExtendsClassx.prototype.aNewMethod = function() {
		alert(this.name+"ffd");
	};
	var objex = new ExtendsClassx("fff");
	objex.aNewMethod(); //alert("fff"+"ffd")
	alert(objex.name); //alert("fff");

	obj1.aNewMethod(); //不能調用了!
	alert(obj1.name); //alert("2222");


 

 

 

 

發佈了52 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章