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(sub).forEach(function(k){ fn.prototype[k] = o[k]; }); return fn; }; // 静态方法 fn.statics = function(o){ Object.keys(sub).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(){ Animal.call(this,call); }); 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
原文:http://my.oschina.net/bosscheng/blog/523231