如何在不执行的情况下使函数可链接?比如`obj.fn.fn`而不是`obj.fn()。fn()`

时间:2015-05-06 12:05:49

标签: javascript method-chaining

我在对象中有两个函数

var obj = {};
obj.fn1 = function(){ console.log('obj.fn1'); return this; };
obj.fn2 = function(){ console.log('obj.fn2'); return this; };

我希望能够做到

obj.fn1.fn2()
obj.fn2.fn1()

怎么做?

编辑:fn1fn2可能是函数或属性访问器,只要他们做东西我就不在乎。

我在很多图书馆看到过,例如chalk color.red.bold('string')

2 个答案:

答案 0 :(得分:1)

如果fn1fn2obj都引用了这两个功能,则可以执行此操作。 Object.assign(ES6)在这里有所帮助:

var base = {
  fn1: function fn1() { console.log('fn1'); return this; },
  fn2: function fn2() { console.log('fn2'); return this; }
}

Object.assign(base.fn1, base);
Object.assign(base.fn2, base);
var obj = Object.assign({}, base);

obj.fn1();
obj.fn1.fn2();
obj.fn2();
obj.fn1.fn2.fn1.fn1();

babel.js repl

我希望这是你的库示例的工作方式。

如果Object.assign不可用,您可以使用polyfill或来自lodash的_.assign等常用替代方案。

答案 1 :(得分:0)

我认为它只是一些嵌套对象。看看这段代码:



function Color(c) { this.color = c; }
Color.prototype.bold = function(text) { return '<strong style="color: ' + this.color + '">' + text + '</strong>'; }

var colors = {
  red: new Color('red'),
  blue: new Color('blue')
}

document.write(
  colors.red.bold('text'));

document.write(
  colors.blue.bold('text'));
&#13;
&#13;
&#13;