Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 扩展Node.js中的Array.prototype,从require';d文件_Javascript_Node.js_Require - Fatal编程技术网

Javascript 扩展Node.js中的Array.prototype,从require';d文件

Javascript 扩展Node.js中的Array.prototype,从require';d文件,javascript,node.js,require,Javascript,Node.js,Require,我在test.js中保存了以下内容。它成功地在浏览器中扩展了阵列,但似乎无法处理节点和需求。有人能解释一下这里出了什么问题吗 (function() { Array.prototype.max = function() { return console.log("Array.prototype.max"); }; return Array.max = function() { return console.log("Array.max"); }; }).call(this); 然后

我在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.<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)
>我的MacBook Pro:me$节点
>var测试=要求(“/测试”)
>[1,2,3].max()
TypeError:对象1,2,3没有方法“max”
在[对象上下文]:1:9
在接口处。(回复js:171:22)
在Interface.emit(events.js:64:17)
在接口处在线(readline.js:153:10)
在接口处。\u行(readline.js:408:8)
在接口处写入(readline.js:585:14)
在ReadStream。(readline.js:73:12)
在ReadStream.emit(events.js:81:20)
在ReadStream._emitKey(tty_posix.js:307:10)
在ReadStream.onData(tty_posix.js:70:12)
>Array.max()
TypeError:对象函数数组(){[本机代码]}没有方法“max”
在[对象上下文]:1:7
在接口处。(回复js:171:22)
在Interface.emit(events.js:64:17)
在接口处在线(readline.js:153:10)
在接口处。\u行(readline.js:408:8)
在接口处写入(readline.js:585:14)
在ReadStream。(readline.js:73:12)
在ReadStream.emit(events.js:81:20)
在ReadStream._emitKey(tty_posix.js:307:10)
在ReadStream.onData(tty_posix.js:70:12)

REPL中的每个命令都是通过带有共享上下文对象的
vm.runInContext
执行的。此对象是在REPL初始化时通过复制
全局对象中的所有内容创建的。由于所需模块仅在复制到上下文对象后扩展
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 */

启动时引用此文件一次就足以使用…

您是否在REPL之外尝试过它(即在文件中运行)?如果我找到了它,请参阅我的更新答案。此示例现在在节点0.6中起作用。已确认在0.4.1中不起作用。