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 noth
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, enumerable: false, 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, name, 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, name, desc);
} else if (isFunc) {
desc.value = prop[name];
Object.defineProperty(prototype, name, 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], name, 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, propertyName, prop[getter] ? prop[getter] : prototype[getter], prop[name], 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();
