Как экспортировать модифицированный прототип в пакет Node.js? - PullRequest
2 голосов
/ 14 сентября 2011

Я могу экспортировать функции:

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

И я могу модифицировать прототипы:

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

Но последний работает только в интерпретаторе Node.Когда я изменяю прототипы внутри пакета Node, а затем require пакета, Node игнорирует модификацию прототипа.Он жалуется, что Object.foo не существует.

1 Ответ

2 голосов
/ 14 сентября 2011

Поскольку вы хотите сделать monkeypatch Object, давайте рассмотрим, что делается. Я собираюсь использовать пример со страницы радостного 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, а не корневым объектом.

...