class.js

function _inheritPrototype(subType,superType){
    var prototype = Object.create(superType.prototype);  // 复制原型链
    prototype.constructor = subType;  // 设置 constructor 为自己 
    subType.prototype = prototype; //  设置 prototype 的值。
    
    Object.keys(superType).forEach(function(k){
        subType[k] = superType[k];
    });
}


function _wrap(fn){
    // 继承实现。 
    fn.extend = function(sub){
        _inheritPrototype(sub,fn);
        return wrap(fn);
    };
    
    // 原型链方法。
    fn.methods = function(o){
        Object.keys(o).forEach(function(k){
                fn.prototype[k] = o[k];
            });
            return fn;
    };
    
    // 静态方法
    fn.statics = function(o){
        Object.keys(o).forEach(function(k){
                fn[k] = o[k];
            });
            return fn;
    };

    return fn;
}

function Klass(fn){
    return _wrap(fn || function(){});
}

Klass.extend = _inheritPrototype;


// test

var Animal = Klass(function(name){
    this.name = name;
}).methods({
    talk:function(){
        return 'i am'+ this.name;
    }
});

var Bird = Animal.extend(function(name){
    Animal.call(this,name);
});

Bird.methods({
    fly:function(){
        return 'i am flying ';
    }
})


var bird = new Bird('bird');

console.log(bird.talk()); // i am bird
console.log(bird.fly());// i am flying

    ths: https://github.com/aralejs/class/issues/15

你可能感兴趣的:(Class)