2

以下节点最片段来自 Node.js 测试,我想知道为什么实例化对象的一种方法优于另一种?

// 1
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('test', doSomething);

// 2
var net = require('net');
var server = net.createServer();
server.on('connection', doSomething);

// 3
var net = require('http');
var server = http.Server(function(req, res) {
  req.on('end', function() { ... });
});

我正在开发一个 Node.js 模块,并试图找到这些 API 的通用方式。

4

2 回答 2

2

#1 使用 JavaScript 的关键字来处理创建一个很可能new具有原型的新对象,而 #2 和 #3 使用工厂方法创建一些对象(可能有也可能没有原型)。

// 1
function EventEmitter() {
    /* Disadvantage: Call this without `new` and the global variables 
    `on` and `_private` are created - probably not what you want. */
    this.on = function() { /* TODO: implement */ };
    this._private = 0;
}
/* Advantage: Any object created with `new EventEmitter`
   will be able to be `shared` */
EventEmitter.prototype.shared = function() {
    console.log("I am shared between all EventEmitter instances");
};

// 2 & 3
var net = {
    /* Advantage: Calling this with or without `new` will do the same thing
       (Create a new object and return it */
    createServer: function() {
        return {on: function() { /* TODO: implement */ }};
    }
};
/* Disadvantage: No shared prototype by default */
于 2013-05-14T05:06:06.660 回答
2

#1 和 #3 相同,http.Server 可以用作工厂,因为其中的第一行:

if (!(this instanceof Server)) return new Server(requestListener);

#2 在顶级 api 函数中很有用,因为它使链接更简单:

require('http').createServer(handler).listen(8080);

代替

(new require('http').Server(handler)).listen(8080);

核心 api 模块公开构造函数和工厂助手是很常见的,比如Serverand createServer,并允许在没有new.

于 2013-05-14T05:27:33.513 回答