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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值