当我写出这段代码时,恍然大悟!!!
function Animal(){
}
Animal.prototype = {
group : '',
gender : '',
eat : function(){
return 'Yum , food! nom nom';
},
sleep : function(){
return 'zzzzzz...';
}
}
function Bird(){
}
function extend(subClass,superClass){
/*声明一个空构造函数*/
function fn(){}
/*将空函数原型指向父类,这样fn就有了superClass成员了,fn是为下面子类继承做准备用的。*/
fn.prototype = superClass.prototype;
/*将子类的原型指向空函数的实例*/
subClass.prototype = new fn();
/*因为前面改变了子类构造函数的原型会影响constructor属性(指向Object了),所以重新指定一下子类的constructor属性*/
subClass.prototype.constructor = subClass;
/*添加一个属性,保存子类的父类构造函数*/
subClass.baseConstructor = superClass;
/*添加一个属性,保存子类的父类构造函数原型*/
subClass.__super__ = superClass.prototype;
}
extend(Bird , Animal);
var bird = new Bird();
console.log(bird.eat());
function Animal(){
}
Animal.prototype = {
group : '',
gender : '',
eat : function(){
return 'Yum , food! nom nom';
},
sleep : function(){
return 'zzzzzz...';
},
walk : {
"method" : "walk"
}
}
function Bird(){
}
function Person(){
}
function extend(subClass,superClass){
/*声明一个空构造函数*/
function fn(){}
/*将空函数原型指向父类,这样fn就有了superClass成员了,fn是为下面子类继承做准备用的。*/
fn.prototype = superClass.prototype;
/*将子类的原型指向空函数的实例*/
subClass.prototype = new fn();
/*因为前面改变了子类构造函数的原型会影响constructor属性(指向Object了),所以重新指定一下子类的constructor属性*/
subClass.prototype.constructor = subClass;
/*添加一个属性,保存子类的父类构造函数*/
subClass.baseConstructor = superClass;
/*添加一个属性,保存子类的父类构造函数原型*/
subClass.__super__ = superClass.prototype;
}
extend(Bird , Animal);
extend(Person , Animal);
var bird = new Bird();
var person = new Person();
bird.walk.method = "fly";
console.log(person.walk.method);
/*将子类的原型指向空函数的实例*/
subClass.prototype = new fn();
function extend(subClass,superClass){
if(Object.create){
subClass.prototype=Object.create(superClass.prototype,{});
}
else{
function fn(){}
fn.prototype = superClass.prototype;
subClass.prototype = new fn();
}
subClass.prototype.constructor = subClass;
subClass.baseConstructor = superClass;
subClass.__super__ = superClass.prototype;
}
extend : function(){
// inline overrides
var io = function(o){
for(var m in o){
this[m] = o[m];
}
};
var oc = Object.prototype.constructor;
return function(sb, sp, overrides){
if(typeof sp == 'object'){
overrides = sp;
sp = sb;
sb = overrides.constructor != oc ? overrides.constructor : function(){
sp.apply(this, arguments);
};
}
var F = function(){},
sbp,
spp = sp.prototype;
F.prototype = spp;
sbp = sb.prototype = new F();
sbp.constructor=sb;
sb.superclass=spp;
if(spp.constructor == oc){
spp.constructor=sp;
}
sb.override = function(o){
Ext.override(sb, o);
};
sbp.superclass = sbp.supr = (function(){
return spp;
});
sbp.override = io;
Ext.override(sb, overrides);
sb.extend = function(o){
return Ext.extend(sb, o);
};
return sb;
};
}()