【问题标题】:How do I export a modified prototype in a Node.js package?如何在 Node.js 包中导出修改后的原型?
【发布时间】:2011-09-15 00:26:58
【问题描述】:

我可以导出函数:

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

而且我可以修改原型:

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

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

【问题讨论】:

  • 我认为您需要添加更多代码。您是否返回exports = Object.prototype.foo 等?
  • 细节并不重要。我想为所有对象添加一个 foo 函数,并让包在我调用 require("foo") 时执行此操作。
  • 等一下,你想修改全局对象吗?听起来……很危险。至于如何做到这一点,你不能用require来做到这一点。
  • 它被称为monkeypatching,Smalltalk、Ruby 和Lisp 允许这样做。这并不危险。我只想在 Object 中添加一个foo 方法。奇怪的是 Node.js 允许进行猴子补丁(试试吧),但是当从包中导入完全相同的代码时似乎忘记了修改。
  • 我知道monkeypatching 是什么,但我不确定对基本对象原型执行一次合适的频率。但我对这个概念非常熟悉。至于为什么从包中导入时不能这样做,那是因为您将其分配给了变量。让我建立一个答案。

标签: node.js prototype export package


【解决方案1】:

既然你想做的是猴子补丁Object,让我们考虑一下正在做的事情。我将使用节点项目的joyent github页面中的一个示例,因为这是相当规范的并且提供了一个可靠的示例进行比较,我们都同意“正常工作”(因为如果它没有......好吧)

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 原型上。我能看到的唯一方法是在调用主体中有代码,需要循环遍历这些代码并将它们应用于其中的对象。

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

否则,您会将原型增强功能限制为专门返回的 var,而不是根对象。

【讨论】:

  • 感谢您提供不相关的代码示例。让我再重申一遍:我想在Object 中添加一个函数,但要在一个包中进行。
  • 我的意思是,你不能那样做,我解释了为什么不使用真实代码。我还在我的代码中给出了这样做的方法。
猜你喜欢
  • 1970-01-01
  • 2013-08-08
  • 2017-10-27
  • 2011-10-02
  • 2014-07-10
  • 2013-01-22
  • 1970-01-01
相关资源
最近更新 更多