首先贴出prototype.js实现继承的代码:
很明显,这里把source的所有属性copy到destination下,即destination继承source,由于只是简单的属性copy,所以写代码的时候要注意调用Object.extend的顺序,否则无法实现overriding。举个例子:
输出结果为:Animal stepping !
而我本来是想在子类People覆盖掉父类Animal的step方法的,原因很简单:最后才声明People继承Animal,copy过程中父类把子类的方法覆盖了!!
正确的办法是先声明继承(把父类的属性先copy过来),然后再定义子类的方法、属性,比如这个例子,即把
Object.extend(People.prototype,Animal)//copy 事例变量
这句放到var People=Class.create();之后。
Object.extend = function(destination, source) {
for (var property in source) {
destination[property] = source[property];
}
return destination;
}
很明显,这里把source的所有属性copy到destination下,即destination继承source,由于只是简单的属性copy,所以写代码的时候要注意调用Object.extend的顺序,否则无法实现overriding。举个例子:
var Animal={
step:function(){
alert('Animal stepping !')
}
}
var People=Class.create();
People.prototype={
initialize:function(name){
this.name=name;
},
step:function(){
alert(" People "+this.name+' stepping !')
},
work:function(){
alert('People '+this.name+' can work ')
}
}
Object.extend(People.prototype,Animal)//copy 事例变量
var p=new People('xqxq');
p.step();
输出结果为:Animal stepping !
而我本来是想在子类People覆盖掉父类Animal的step方法的,原因很简单:最后才声明People继承Animal,copy过程中父类把子类的方法覆盖了!!
正确的办法是先声明继承(把父类的属性先copy过来),然后再定义子类的方法、属性,比如这个例子,即把
Object.extend(People.prototype,Animal)//copy 事例变量
这句放到var People=Class.create();之后。