Cocos.js inherited to achieve source code

CCClass.js

(function () {
var fnTest = /_super/;
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);
< br /> // 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 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;< br />
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
Clas s.implement = function (prop) {
for (var name in prop) {
prototype[name] = prop[name];
}
};
return Class;
};
})();

Use:

var AssetsManagerLoaderScene = cc.Scene.extend();

< /div>

CCClass.js

(function () {
var fnTest = /_super/;
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< br /> * @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 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;
};
})();

Use:

var AssetsManagerLoaderScene = cc.Scene.extend();

Leave a Comment

Your email address will not be published.