Javascript reduce函数没有';我不能做这件事

Javascript reduce函数没有';我不能做这件事,javascript,arrays,javascript-objects,reduce,dom-events,Javascript,Arrays,Javascript Objects,Reduce,Dom Events,我是Javascript新手,尝试在父对象上执行下面的代码,但它没有按预期工作。请帮忙 以下代码无法按预期工作,并引发错误: “TypeError:this.reduce不是函数” 它抛出如下错误: TypeError:this.reduce不是一个函数 反对。(C:\ProgramFiles\nodejs\merge.js:1:100) 在模块处编译(Module.js:434:26) 在Object.Module.\u extensions..js(Module.js:452:10) 在Mo

我是Javascript新手,尝试在父对象上执行下面的代码,但它没有按预期工作。请帮忙

以下代码无法按预期工作,并引发错误:

“TypeError:this.reduce不是函数”

它抛出如下错误:

TypeError:this.reduce不是一个函数
反对。(C:\ProgramFiles\nodejs\merge.js:1:100)
在模块处编译(Module.js:434:26)
在Object.Module.\u extensions..js(Module.js:452:10)
在Module.load(Module.js:355:32)
在Function.Module.\u加载(Module.js:310:12)
位于Function.Module.runMain(Module.js:475:10)
启动时(node.js:117:18)
在node.js:951:3
如果我直接调用数组,它可以正常工作,但这不是我想要做的。我应该能够传递数组,如上面的示例代码所示

Array.prototype.merge = merge = [1,2,3,4,5,6].reduce(function(arg1,arg2)   {
    return arg1+arg2;
},[]);

console.log(arrays.merge);

我将向
数组添加一个合并函数。原型如下:


更多关于Javascript中的
this
关键字的信息。

这应该可以做到

Array.prototype.merge = function () {
    return this.reduce(function (arg1, arg2) {return arg1 + arg2;},[]);
};

顺便说一下,这是有效的,因为在本例中,
this
是调用该方法的对象,它是您的合并函数

使用Object.defineProperty-

或使用reduce

Object.defineProperty(Array.prototype, 'merge', {
  get: function() { 
    return this.reduce(function (arg1, arg2) {
      return arg1 + arg2;
     }, []); 
  },
  enumerable: false,
  configurable: true
});
这段代码将允许您执行您在几条注释中所说的操作

console.log([1,2,3,4,5].merge);
而不是

console.log([1,2,3,4,5].merge());

这是因为在您的代码中,
这个
没有设置为数组对象,而是设置为全局对象。感谢您回答这个@OceansOnPluto,但是我如何将“this”引用到数组对象并按照我在示例中显示的方式调用“arrays.merge”?首先,您想做什么?您希望您的预期回报是什么?当我调用“consol.log(arrays.merge)”时,它应该打印123456给我。次要但重要的注意事项是,您需要调用
arrays.merge()
,而不是
arrays.merge
。缺少paren会使它返回函数对象,而不是运行函数代码。(一旦你解决了另一个问题。)谢谢你的回答。我可以使用这个函数使它工作,但这不是我想在这里做的。我想做“consol.log(arrays.merge)”,它应该打印结果123456。这可能吗?正如我上面提到的,如果我用reduce函数上的直接数组调用来替换它,那么它将按预期工作,但我无法使用“this”进行动态操作。是的,它可以工作,但我想知道是否可以使用变量而不是作为函数合并。我想做“consol.log(arrays.merge)”,它应该打印结果123456。这可能吗?抱歉,如果我问了一些愚蠢的问题,但我是javascript新手,来自java世界。正如我上面提到的,如果我用reduce函数上的直接数组调用来替换这个函数,它的效果会比预期的好,但是我不能用“this”来做动态操作。不,没关系。不要因为问而感到难过!但据我所知,如果不修改数组构造函数,这是不可能的,我也不完全确定你能做到这一点。您需要将其作为一个可以调用的函数。但是,我可以问一下用例吗?调用
console.log(theArray.merge())
与调用
console.log(theArray.merge)
不同吗?您想要的用例是什么?我可以使用方法而不是变量,这很好,但我想知道这在javascript工作中有什么不同。当执行下面的代码时,下面的代码可以很好地工作,但是如果我通过它,它就不工作了。Array.prototype.merge=merge=[1,2,3,4,5,6].reduce(函数(arg1,arg2){return arg1+arg2;},[]);数组=[1,2,3,4,5,6];log(arrays.merge);那么,我的答案是不是被接受的,你一直在寻找的答案?还是你还不清楚?不知道你的意思。:)对答案是完美的。非常感谢。但我只是想知道这对javascript的工作有什么影响。当执行下面的代码时,下面的代码可以正常工作,但如果我通过“this”则无法工作。Array.prototype.merge=merge=[1,2,3,4,5,6].reduce(函数(arg1,arg2){return arg1+arg2;},[]);数组=[1,2,3,4,5,6];log(arrays.merge);好极了。有趣的是,我可以定义这样的属性。谢谢@jaromandaxb顺便说一句,特别是对于数组,最重要的是要有
可枚举:false
-否则一些(旧的和愚蠢的)库在数组上使用
for…in
会以有趣的方式失败(我在看你telerik)
Object.defineProperty(Array.prototype, 'merge', {
  get: function() { 
    return this.reduce(function (arg1, arg2) {
      return arg1 + arg2;
     }, []); 
  },
  enumerable: false,
  configurable: true
});
console.log([1,2,3,4,5].merge);
console.log([1,2,3,4,5].merge());