对象方法链接

时间:2015-11-05 03:46:24

标签: javascript function object methods method-chaining

function modifyFunction(f) {
    return function () {
        var returnValue = f.apply(this, arguments);
        console.log(returnValue);
        if (returnValue == undefined) {
            return this;
        } else {
            return returnValue;
        }
    };
}

function modifyMethod(o, m) {
    if (o.hasOwnProperty(m)) {
        if (o[m] instanceof Function) {
            o[m] = modifyFunction(m);
        }
    }
}

var o = {
    num: 0,
    add: function (x) {
        return this.num += x;
    },
    sub: function (x) {
        return this.num -= x;
    }
};

modifyMethod(o, "add");
o.add(2).add(4);
console.log(o.num); // o.num = 6
modifyMethod(o, "sub");

o.sub(1).add(3).sub(5);
console.log(o.num); // o.num = 3

如何在" if(o [m] instanceof Function)"内的modifyMethod函数中创建它。当发送它o [m]时,它将等于modifyFunction函数返回的内容?我试图让它成为可链接的,但我很难解决这个问题。

1 个答案:

答案 0 :(得分:0)

使o.add(2).add(4);等于o.add(2); o.add(4);我们可以观察到o.add(2)返回的内容应为o。所以你的modifyFunction应该返回一个函数:

  1. 使用给定参数调用传入函数。

  2. 返回来电者。

  3. 因此,不应该返回returnValue(即o.num,一个数字),而应该始终返回this

    另一点是,在modifyMethod中,在您检查o[m]是否为函数后,您应该传递该函数,而不是m这只是关键字。所以它应该是o[m] = modifyFunction(o[m]);

    
    
    function modifyFunction(f) {
        return function () {
            var returnValue = f.apply(this, arguments);
            // Return the object that call this function, 
            // so it becomes chainable.
            return this;
        };
    }
    
    function modifyMethod(o, m) {
        if (o.hasOwnProperty(m)) {
            if (o[m] instanceof Function) {
                // Pass o[m], not m, m is a string.
                o[m] = modifyFunction(o[m]);
            }
        }
    }
    
    var o = {
        num: 0,
        add: function (x) {
            return this.num += x;
        },
        sub: function (x) {
            return this.num -= x;
        }
    };
    
    modifyMethod(o, "add");
    o.add(2).add(4);
    console.log(o.num); // o.num = 6
    modifyMethod(o, "sub");
    
    o.sub(1).add(3).sub(5);
    console.log(o.num); // o.num = 3