从require.d文件扩展Node.js中的Array.prototype

Geo*_*off 5 javascript require node.js

我将以下内容保存在test.js中。它在浏览器中成功扩展了Array,但似乎不适用于node和require。有人可以解释这是怎么回事吗?

(function() {

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

}).call(this);
Run Code Online (Sandbox Code Playgroud)

然后,从终端:

> 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.<anonymous> (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.<anonymous> (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.<anonymous> (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.<anonymous> (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)
Run Code Online (Sandbox Code Playgroud)

Bar*_*ler 6

您可以创建一个包含扩展名的文件:

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];
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将此文件包含到您的启动文件中。

app.js:

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

在启动时引用此文件就足以使用...


Ric*_*asi 0

REPL 中的每个命令都是通过vm.runInContext共享上下文对象执行的。该对象是在 REPL 初始化时通过复制该global对象中的所有内容来创建的。由于 required 模块仅在复制到上下文对象Array.prototype 后才会扩展,因此修改后的版本永远不会公开。

或者至少这是我可以从源代码中推断出来的。我对 V8 的内部工作原理一无所知:) 正如您现在可能已经发现的那样,您的示例在 REPL 之外运行良好。