如何在Node.js包中导出修改后的原型?

时间:2011-09-14 02:03:36

标签: node.js prototype export package

我可以导出功能:

exports.foo = function() { return "bar"; };

我可以修改原型:

Object.prototype.foo = function() { return "bar"; };

但后者仅适用于Node解释器。当我在Node包中修改原型然后require包时,Node会忽略原型修改。它抱怨Object.foo不存在。

1 个答案:

答案 0 :(得分:2)

因为你要做的是monkeypatch Object让我们考虑一下正在做什么。我将使用节点项目的joyent github页面中的一个示例,因为它相当规范并且提供了一个比较的可靠示例,我们都同意“正常工作”(如果它没有......那就是cos)

  

https://github.com/joyent/node/blob/master/lib/http2.js#L22

var util = require('util');
var net = require('net');
var stream = require('stream');
var EventEmitter = require('events').EventEmitter;
var FreeList = require('freelist').FreeList;
var HTTPParser = process.binding('http_parser').HTTPParser;
var assert = require('assert').ok;

var parsers = new FreeList('parsers', 1000, function() {
  var parser = new HTTPParser('request');

  parser.onMessageBegin = function() {
    parser.incoming = new IncomingMessage(parser.socket);
    parser.field = null;
    parser.value = null;
  };

我们在这个例子中看到的是一堆必需的模块,它们被分配给变量。从来没有结婚的人回到Object原型。我能看到这样做的唯一方法是在调用体中有代码,它需要循环遍历这些代码并将它们应用到其中的Object。

换句话说,我能看到做你想做的事的唯一方法就是在你的应用程序根目录中做你想做的事。或者对可能要合并的两个对象进行某种组合,如果这是目标。

否则,您将原型增强限制为特定返回的var,而不是根对象。