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