0

几天前,我正在研究Superagent模块,我想知道如何编写代码以同时支持类似request('url', callback);和类似的语法request.get('url').end(callback);

我试图查看源代码,但我不明白它是如何制作的。

谁能告诉我该怎么做?

4

1 回答 1

2

如果您尝试使用类似的 API 定义模块...

FunctionJavaScript 中的 s 是 的一种Object,因此可以传递对它们的引用,并且可以为它们赋予属性,包括其他functions 作为方法。

在这种情况下,request它只是一个functionget赋值为它的属性之一

function request(method, url) {
  // ...

  return new Request(method, url);
}

request.get = function(url, data, fn){
  var req = request('GET', url);

  // ...

  return req;
};

对于任何一个,值returned 都是一个Request实例,它有一个end延续到实例的方法return

Request.prototype.end = function(fn) {
  // ...

  return this;
};

这允许使用方法链接的流畅 API

request
  .get('...', function () {})
  .end(function () {});
  .end(function () {});
// that does the same as...
var req = request.get('...', function () {});
req.end(function () {});
req.end(function () {});
于 2014-04-26T21:52:19.053 回答