Cocos2d-JS中JavaScript继承

Cocos2d-JS中JavaScript继承,第1张

概述JavaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求。由于Cocos2d-JS引擎是从Cocos2d-x演变而来的,在Cocos2d-JS的早期版本Cocos2d-HTML中几乎全部的API都是模拟Cocos2d-x API而设计的,Cocos2d-x本身是有C++编写的,其中的很多对象和函数比较复杂,Java 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-javascript-inheritance/)中提供了一种简单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非常的重要。


更多内容请关注最新Cocos图书《 Cocos2d-x实战:Js卷——Cocos2d-Js开发本书交流讨论网站: http://www.cocoagame.net
欢迎加入Cocos2d-x技术讨论群:257760386
更多精彩视频课程请关注智捷课堂Cocos课程: http://v.51work6.com
智捷课堂现推出Cocos会员,敬请关注: http://v.51work6.com/courseInfoRedirect.do?action=netDetialInfo&courseId=844465&categoryId=0

《Cocos2d-x实战 Js卷》现已上线,各大商店均已开售:

京东:http://item.jd.com/11659698.html

欢迎关注智捷iOS课堂微信公共平台,了解最新技术文章、图书、教程信息
总结

以上是内存溢出为你收集整理的Cocos2d-JS中JavaScript继承全部内容,希望文章能够帮你解决Cocos2d-JS中JavaScript继承所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1048666.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存