通过访问器传递函数的标志 - 它是哪种JavaScript模式?

时间:2011-12-06 05:59:28

标签: javascript design-patterns node.js socket.io

我注意到socket.io-node中的以下模式:

// e.g. 1
socket.volatile.emit('bieber tweet', tweet);

// e.g. 2
socket.broadcast.json.send({ a: 'message' });

更一般地说,它似乎是风格:

someObject.functionFlagA.functionFlagB.functionFlagEtc.someFunction(/* etc */);

这个模式被称为什么,在一个访问器链中添加可能影响函数执行的标志,每个访问器返回目标函数(与任何其他可用/适当的可链接访问器)?什么时候适当结束,比如只是将一些参数传递给函数?

看着它让我想到为我的HTML5网络应用创建一个sync对象,如下所示:

// Saves someObj to localStorage AND to server-maintained session
sync.toLocalStorage.toServer.save(someObj);

...因为它会比以下更加自我记录:

// Saves someObj to localStorage AND to server-maintained session
sync.save(someObj, true, false, true);

这是否适合使用上述模式?


编辑2011-12-06 13:06:15

对于好奇,这就是socket.io实现它的方式:

Socket.prototype.__defineGetter__('volatile', function () {
  this.flags.volatile = true;
  return this;
});

在链中使用哪个最终调用以下内部函数,该函数发送数据包并清除标志:

Socket.prototype.packet = function (packet) {
  /* snip */
  this.setFlags(); // clears this.flags

  return this;
};

1 个答案:

答案 0 :(得分:2)

我将其称为流畅的界面的示例。

来自Wikipedia article

  

在软件工程中,一个流畅的界面(由Eric创造的第一个)   Evans和Martin Fowler)是面向对象的实现   旨在提供更易读代码的API。流畅的界面是   通常使用方法链接来实现中继指令   后续电话的背景。

当然,在您的示例中,您拥有属性而不是方法。但是看一下socket.io-node代码,'属性'被编程为__defineGetter__,所以你不妨说它们是方法。

关于HTML5的同步对象:在调用save之后考虑同步对象的状态。它是重置为原始状态还是记住配置?如果连续两次调用保存会怎么样?

如果它只是可读性,你也可以让调用者像这样传递配置:

sync.save(someObj, { toLocalStorage: true, toServer: true });