Расширение Array.prototype в Node.js, из файла require’d

У меня есть следующие сохраненные в test.js. Он успешно расширяет массив в браузере, но, похоже, он не работает с узлом и не требует. Может кто-нибудь объяснить, что здесь не так?

(function() { Array.prototype.max = function() { return console.log("Array.prototype.max"); }; return Array.max = function() { return console.log("Array.max"); }; }).call(this); 

Затем, с терминала:

 > My-MacBook-Pro: me$ node > var test = require("./test") > [1,2,3].max() TypeError: Object 1,2,3 has no method 'max' at [object Context]:1:9 at Interface. (repl.js:171:22) at Interface.emit (events.js:64:17) at Interface._onLine (readline.js:153:10) at Interface._line (readline.js:408:8) at Interface._ttyWrite (readline.js:585:14) at ReadStream. (readline.js:73:12) at ReadStream.emit (events.js:81:20) at ReadStream._emitKey (tty_posix.js:307:10) at ReadStream.onData (tty_posix.js:70:12) > Array.max() TypeError: Object function Array() { [native code] } has no method 'max' at [object Context]:1:7 at Interface. (repl.js:171:22) at Interface.emit (events.js:64:17) at Interface._onLine (readline.js:153:10) at Interface._line (readline.js:408:8) at Interface._ttyWrite (readline.js:585:14) at ReadStream. (readline.js:73:12) at ReadStream.emit (events.js:81:20) at ReadStream._emitKey (tty_posix.js:307:10) at ReadStream.onData (tty_posix.js:70:12) 

Каждая команда в REPL выполняется через vm.runInContext с общим объектом контекста. Этот объект создается при инициализации REPL, копируя все из global объекта. Поскольку модуль require’d будет только расширять Array.prototype после того, как он был скопирован в объект контекста, модифицированная версия никогда не будет Array.prototype .

Или, по крайней мере, это то, что я мог бы вывести из исходного кода . Я ничего не знаю о внутренней работе V8 🙂 И, как вы, наверное, уже выяснили, ваш пример отлично работает вне REPL.

Вы можете создать файл, который включает ваши расширения:

array.extensions.js

 if(!Array.prototype.Last){ Array.prototype.Last = function(){ return this.slice(-1)[0]; } } if(!Array.prototype.First){ Array.prototype.First = function(){ return this[0]; } } 

затем включите этот файл в ваш загрузочный файл.

app.js:

 require('{path}/array.extensions'); var express = require('express'); /* rest of your code */ 

ссылаться на этот файл один раз при запуске достаточно для использования …