相信很多的小白都对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的原型继承有很大的疑问了。这里对原型继承不多做解释,给出链接这里写链接内容很详细,看一下就明白了。
》资料扩展:这里写链接内容
(文章转载的哪里忘记了)