CCClass.js
(function () { var fnTest = /\b_super\b/; var config = cc.game.config; var releaseMode = config[cc.game.CONFIG_KEY.classReleaseMode]; if(releaseMode) { console.log("release Mode"); } /** * The base Class implementation (does nothing) * @class */ cc.Class = function () { }; /** * Create a new Class that inherits from this Class * @static * @param {object} props * @return {function} */ cc.Class.extend = function (props) { var _super = this.prototype; // Instantiate a base Class (but only create the instance,// don't run the init constructor) var prototype = Object.create(_super); var classId = ClassManager.getNewID(); ClassManager[classId] = _super; // Copy the properties over onto the new prototype. We make function // properties non-eumerable as this makes typeof === 'function' check // unneccessary in the for...in loop used 1) for generating Class() // 2) for cc.clone and perhaps more. It is also required to make // these function properties cacheable in Carakan. var desc = { writable: true,enumerable: false,configurable: true }; prototype.__instanceId = null; // The dummy Class constructor function Class() { this.__instanceId = ClassManager.getNewInstanceId(); // All construction is actually done in the init method if (this.ctor) this.ctor.apply(this,arguments); } Class.id = classId; // desc = { writable: true,configurable: true,// value: XXX }; Again,we make this non-enumerable. desc.value = classId; Object.defineProperty(prototype,'__pid',desc); // Populate our constructed prototype object Class.prototype = prototype; // Enforce the constructor to be what we expect desc.value = Class; Object.defineProperty(Class.prototype,'constructor',desc); // Copy getter/setter this.__getters__ && (Class.__getters__ = cc.clone(this.__getters__)); this.__setters__ && (Class.__setters__ = cc.clone(this.__setters__)); for(var idx = 0,li = arguments.length; idx < li; ++idx) { var prop = arguments[idx]; for (var name in prop) { var isFunc = (typeof prop[name] === "function"); var override = (typeof _super[name] === "function"); var hasSuperCall = fnTest.test(prop[name]); if (releaseMode && isFunc && override && hasSuperCall) { desc.value = ClassManager.compileSuper(prop[name],name,classId); Object.defineProperty(prototype,desc); } else if (isFunc && override && hasSuperCall) { desc.value = (function (name,fn) { return function () { var tmp = this._super; // Add a new ._super() method that is the same method // but on the super-Class this._super = _super[name]; // The method only need to be bound temporarily,so we // remove it when we're done executing var ret = fn.apply(this,arguments); this._super = tmp; return ret; }; })(name,prop[name]); Object.defineProperty(prototype,desc); } else if (isFunc) { desc.value = prop[name]; Object.defineProperty(prototype,desc); } else { prototype[name] = prop[name]; } if (isFunc) { // Override registered getter/setter var getter,setter,propertyName; if (this.__getters__ && this.__getters__[name]) { propertyName = this.__getters__[name]; for (var i in this.__setters__) { if (this.__setters__[i] === propertyName) { setter = i; break; } } cc.defineGetterSetter(prototype,propertyName,prop[name],prop[setter] ? prop[setter] : prototype[setter],setter); } if (this.__setters__ && this.__setters__[name]) { propertyName = this.__setters__[name]; for (var i in this.__getters__) { if (this.__getters__[i] === propertyName) { getter = i; break; } } cc.defineGetterSetter(prototype,prop[getter] ? prop[getter] : prototype[getter],getter,name); } } } } // And make this Class extendable Class.extend = cc.Class.extend; //add implementation method Class.implement = function (prop) { for (var name in prop) { prototype[name] = prop[name]; } }; return Class; }; })();
使用:
var AssetsManagerLoaderScene = cc.Scene.extend();