日期:2014-05-16  浏览次数:20355 次

当我写出这段代码时,恍然大悟!!!

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

今天在书上看到这段代码,自己动手试了下,运行成功后,感觉这代码有点眼熟,然后打开Extjs的ext-all-debug.js源码,找到extend方法。果然神似,曾经看的头晕的代码,今天终于明白了,发帖来跟大家分享下,加了点注释,不对的地方希望大家拍砖指正,谢谢。

------解决方案--------------------
空函数继承,很好...
我来个:
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;