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");