相信很多的小白都对extend这个函数有很多的疑惑,今天就把这个根据自己的理解和网上的资料整理了一下。
extend方法:在各种js框架下的设计。这个函数的功能基本都是实现对象的拷贝功能,即将一个对象的所有属属性拷贝到另外一个对象上去,这个函数使用的频率也很高,如果我们要将一个类的所有方法拷贝到另外方法上去,使用这个方法很方便的。
. 在百度tangram js 框架中的实现 baidu.extend = baidu.object.extend = function (target, source) { for (var p in source) { if (source.hasOwnProperty(p)) { target[p] = source[p]; } } return target; };仅有2个参数,extend(target,source),第一个参数是目标对象,第二个参数是原对象 ,对原对象中的每个属性进行判断,如果是,那么将他拷贝到目标的对象上去。
cocos2dx中的实现 (function () { var initializing = false, fnTest = /xyz/.test(function () { xyz; }) ? /\b_super\b/ : /.*/; //基类实现(没有) Class = function () { }; // 创建一个新类继承自该类 Class.extend = function (prop) { var _super = this.prototype; //实例化一个基类(但只创建一个实例,不运行init构造函数) initializing = true; var prototype = new this(); initializing = false; //复制到新原型属性 for (var name in prop) { // 检查是否我们覆盖现有的功能 prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function (name, fn) { return function () { var tmp = this._super; // 添加一个新的._super()方法,方法是一样的 // 但超类 this._super = _super[name]; //该方法只需要暂时绑定,所以我们删除它,当我们执行完成 var ret = fn.apply(this, arguments); this._super = tmp; return ret; }; })(name, prop[name]) : prop[name]; } //虚拟类构造函数 function Class() { // 所有建筑的东西实际上都是在init方法 if (!initializing && this.ctor) this.ctor.apply(this, arguments); } //填充我们的原型构造对象 Class.prototype = prototype; // 我们期望执行构造函数 Class.prototype.constructor = Class; // 并使这个类扩展 Class.extend = arguments.callee; //添加的实现方法 Class.implement = function (prop) { for (var name in prop) { prototype[name] = prop[name]; } }; return Class; }; })();在开源社区中John Resiq在他的博客(http://ejohn.org/blog/simple-javascript-inheritance/)中提供了一种简单JavaScript继承(Simple JavaScript Inheritance)方法。 John Resiq的简单JavaScript继承方法灵感来源于原型继承机制,它具有与Java等面向对象一样的类概念,并且他设计了所有类的根类Class
读到了这里很多小伙伴可能又对JS的原型继承有很大的疑问了。这里对原型继承不多做解释,给出链接这里写链接内容很详细,看一下就明白了。
》资料扩展:这里写链接内容 (文章转载的哪里忘记了)
