视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JavaScript强化教程――Cocos2d-JS中JavaScript继承
2020-11-27 20:26:07 责编:小采
文档

JavaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求。由于Cocos2d-JS引擎是从Cocos2d-x演变而来的,在Cocos2d-JS的早期版本Cocos2d-HTML中几乎全部的API都是模拟Cocos2d-x API而设计的,Cocos2d-x本身是有C++编写的,其中的很多对象和函数比较复杂,JavaScript语言描述起来有些力不从心了。
在开源社区中John Resiq在他的博客(http://ejohn.org/blog/simple-j ... ance/)中提供了一种简单JavaScript继承(Simple JavaScript Inheritance)方法。
John Resiq的简单JavaScript继承方法灵感来源于原型继承机制,它具有与Java等面向对象一样的类概念,并且他设计了所有类的根类Class,它的代码如下:

/* Simple JavaScript Inheritance 
 * By John Resig http://ejohn.org/ 
 * MIT Licensed. 
 */ 
// Inspired by base2 and Prototype 
(function(){ 
 var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; 
 
 // The base Class implementation (does nothing) 
 this.Class = function(){}; 
 
 // Create a new Class that inherits from this class 
 Class.extend = function(prop) { 
 var _super = this.prototype; 
 
 // Instantiate a base class (but only create the instance, 
 // don't run the init constructor) 
 initializing = true; 
 var prototype = new this(); 
 initializing = false; 
 
 // Copy the properties over onto the new prototype 
 for (var name in prop) { 
 // Check if we're overwriting an existing function 
 prototype[name] = typeof prop[name] == "function" && 
 typeof _super[name] == "function" && fnTest.test(prop[name]) ? 
 (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]) : 
 prop[name]; 
 } 
 
 // The dummy class constructor 
 function Class() { 
 // All construction is actually done in the init method 
 if ( !initializing && this.init ) 
 this.init.apply(this, arguments); 
 } 
 
 // Populate our constructed prototype object 
 Class.prototype = prototype; 
 
 // Enforce the constructor to be what we expect 
 Class.prototype.constructor = Class; 
 
 // And make this class extendable 
 Class.extend = arguments.callee; 
 
 return Class; 
 }; 
})();

与Java中的Object一样所有类都直接或间接继承于Class,下面是继承Class实例:

var Person = Class.extend({ ① 
 init: function (isDancing) { ② 
 this.dancing = isDancing; 
 }, 
 dance: function () { ③ 
 return this.dancing; 
 } 
}); 
 
 
var Ninja = Person.extend({ ④ 
 init: function () { ⑤ 
 this._super(false); ⑥ 
 }, 
 dance: function () { ⑦ 
 // Call the inherited version of dance() 
 return this._super(); ⑧ 
 }, 
 swingSword: function () { ⑨ 
 return true; 
 } 
}); 
 
 
var p = new Person(true); ⑩ 
console.log(p.dance());// true 
 
 
var n = new Ninja(); 
console.log(n.dance()); // false 
console.log(n.swingSword()); // true

如果你对于Java语言的面向对象很熟悉的话,应该很容易看懂。其中第①行代码是声明Person类,它继承自Class,Class.extend()表示继承自Class。第②行代码的定义构造函数init,它的作用是初始化属性。第③行代码是定义普通函数dance(),它可以返回属性dancing。
第④行代码是声明Ninja类继承自Person类,第⑤行代码的定义构造函数init,在该函数中this._super(false)语句是调用父类构造函数初始化父类中的属性,见代码第⑥行所示。第⑦行代码是重写dance()函数,它会覆盖父类的dance()函数。第⑧行代码是this._super()是调用父类的dance()函数。第⑨行代码是子类Ninja新添加的函数swingSword()。
第⑩行代码通过Person类创建p对象,给构造函数的参数是true。第行代码是打印日志p对象dance属性,结果为true。
第行代码通过Ninja类创建n对象,构造函数的参数为空,默认初始化采用false初始化父类中的dance属性。因此在代码第行打印为false。
这种简单JavaScript继承方法事实上实现了一般意义上的面向对象概念的继承和多态机制。这种简单JavaScript继承方法是Cocos2d-JS继承机制的核心,Cocos2d-JS稍微做了修改,熟悉简单JavaScript继承的用法对于理解和学习Cocos2d-JS非常的重要。

下载本文
显示全文
专题