extend函数的理解

相信很多的小白都对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的原型继承有很大的疑问了。这里对原型继承不多做解释,给出链接这里写链接内容很详细,看一下就明白了。

》资料扩展:这里写链接内容
(文章转载的哪里忘记了)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部