1个月前写过最简单的那种,再重新实现一遍
//类的实现,一个参数创建类,两个参数继承类 var Klass = function (parent, options) { var hasOwn = Object.prototype.hasOwnProperty, isFunc = function(obj) { return typeof obj === 'function'; }, //中间函数避免执行父类构造函数 Func = function () { },//返回的子类 Child = function () { isFunc(this.initialize) && this.initialize.apply(this, arguments); }, k; //参数check if (arguments.length === 0 || arguments.length > 2) throw new Error("只接受1个或2个参数"); //只传入一个参数对象 if (!isFunc(parent)) { options = parent; parent = null; } //继承父类 if (parent) { Func.prototype = parent.prototype; Child.prototype = new Func(); Child.superproto = parent.prototype; Child.prototype.constructor = Child; } //添加options for (k in options) { if(hasOwn.call(options, k)) Child.prototype[k] = options[k]; } return Child; }; //测试 var Person = Klass({ initialize: function(opt) { this.name = 'unnamed'; $.extend(this, opt); }, getName: function () { return this.name; }, say: function() { console.log("hello world"); } }), Player = Klass(Person, { play: function () { console.log("i'm playing " + this.game); } }),
player1 = new Player({ name: 'bobo', game: 'Dota2' }); player1.play(); // "i'm playing Dota2" player1.say(); // "hello world" console.log(player1.getName()); // "bobo"