網上看到的,當作學習call,apply的一個案例,html
1 var b = {};//base 2 var slice = [].slice; 3 4 b.Class = function (supClass, childAttr) { 5 //如果傳了第一個類,便繼承之;不然實現新類 6 if (typeof supClass === 'object') { 7 childAttr = supClass; 8 supClass = function () { }; 9 } 10 11 //定義咱們建立的類 12 var newClass = function () { 13 this._properties_(); 14 this.init.apply(this, arguments); 15 }; 16 newClass.prototype = new supClass(); 17 18 var supInit = newClass.prototype.init || function () { }; 19 var childInit = childAttr.init || function () { }; 20 var _supAttr = newClass.prototype._properties_ || function () { }; 21 var _childAttr = childAttr._properties_ || function () { }; 22 23 for (var k in childAttr) { 24 //_properties_中做爲私有屬性 25 childAttr.hasOwnProperty(k) && (newClass.prototype[k] = childAttr[k]); 26 } 27 28 //繼承的屬性有可能重寫init方法 29 if (arguments.length && arguments[0].prototype && arguments[0].prototype.init === supInit) { 30 //重寫新建類,初始化方法,傳入其繼承類的init方法 31 newClass.prototype.init = function () { 32 var scope = this; 33 var args = [function () { 34 supInit.apply(scope, arguments); 35 } ]; 36 childInit.apply(scope, args.concat(slice.call(arguments))); 37 }; 38 } 39 40 //內部屬性賦值 41 newClass.prototype._properties_ = function () { 42 _supAttr.call(this); 43 _childAttr.call(this); 44 }; 45 46 //成員屬性 47 for (var k in supClass) { 48 supClass.hasOwnProperty(k) && (newClass[k] = supClass[k]); 49 } 50 return newClass; 51 };
原文地址:http://www.cnblogs.com/yexiaochai/p/3236544.htmlapp