JavaScript设计模式(三十一)【参与者模式】

/**
 * participator 参与者模式,在特定的作用域中执行给定的函数,并将参数原封不动的传递
 * 一个很常见的功能是,我们希望把额外的数据传入回调函数中
 * 但是毫无疑问,addEventListener并不想管我们
 * 于是我们自己在回调函数中动手解决吧
 *
 * 不过说实话这书上的代码和没说没什么区别………………
 *
 * */
var A = {};
A.event.on = function(dom, type, fn, data) {
    if (dom.addEventListener) {
        dom.addEventListener(type,
            function(e) {
                fn.call(dom, e, data);
            },
            false);
    } else if (dom.attachEvent) {
        // .....
    } else {
        // dom 0级
        // .....
    }
};

// 这样做存在一个问题,就是这是一个匿名函数,所以这个事件无法移除了,这就需要参与者模式了
// 书上的参与者似乎是想用bind函数来搞
function bind(fn, context) {
    var slice = Array.prototype.slice;
    var args = slice.call(arguments, 2);
    return function() {
        var addArgs = slice.call(arguments);
        var allArgs = addArgs.concat(args);
        return fn.apply(context, allArgs);
    }
}

if (!Function.prototype.bind) {
    Function.prototype.bind = function(oThis) {
        if (typeof this !== "function") {
            // closest thing possible to the ECMAScript 5 internal IsCallable function
            throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
        }

        var aArgs = Array.prototype.slice.call(arguments, 1),
            fToBind = this,
            fNOP = function() {},
            fBound = function() {
                return fToBind.apply(this instanceof fNOP && oThis
                    ? this
                    : oThis || window,
                    aArgs.concat(Array.prototype.slice.call(arguments)));
            };

        fNOP.prototype = this.prototype;
        fBound.prototype = new fNOP();

        return fBound;
    };
}

/************************************************/

// 函数绑定
function bind(fn, context) {
    return function() {
        return fn.apply(context, arguments);
    }
}

// 函数柯里化
function curry(fn) {
    var Slice = [].slice;
    var args = Slice.call(arguments, l);
    return function() {
        var addArgs = Slice.call(arguments);
        var allArgs = args.concat(addArgs);
        return fn.apply(null, allArgs);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值