YUI继承 ,以及javascript中的继承

本文详细解析了JavaScript中对象复制与继承的实现方法,包括使用等号、call()函数以及自定义复制函数的方式,并对比了不同实现的优缺点。通过实例分析,揭示了YUI框架在继承和拓展方面的实现细节,以及JavaScript自身在对象复制和拓展上的强大能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值