【问题标题】:Javascript reduce function doesn't work on this objJavascript reduce 函数在这个 obj 上不起作用
【发布时间】:2016-01-08 18:25:43
【问题描述】:

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

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

"TypeError: this.reduce 不是函数"

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

var arrays =  [1,2,3,4,5,6];
console.log(arrays.merge);

报错如下:

TypeError: this.reduce is not a function
    at Object.<anonymous> (C:\Program Files\nodejs\merge.js:1:100)
    at Module._compile (module.js:434:26)
    at Object.Module._extensions..js (module.js:452:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:475:10)
    at startup (node.js:117:18)
    at 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);

【问题讨论】:

  • 这是因为在您的代码中,this 没有设置为数组对象,而是设置为全局对象。
  • 感谢您回答这个@OceansOnPluto,但我如何将“this”引用到数组对象并按照我在示例中展示的方式调用“arrays.merge”?
  • 首先,你想做什么?你希望你的预期回报是什么?
  • 当我调用“consol.log(arrays.merge)”时,它应该向我打印 123456
  • 次要但重要的注意事项,您需要致电arrays.merge() 而不是arrays.merge。缺少括号会使其返回函数对象而不是运行函数代码。 (一旦你解决了其他问题。)

标签: javascript arrays javascript-objects reduce dom-events


【解决方案1】:

这应该可以解决问题!

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

顺便说一句,这是可行的,因为在这种情况下,this 是正在调用该方法的对象,它是您的合并函数。

【讨论】:

  • 是的,但想知道是否可以使用变量而不是合并作为函数。我想做“consol.log(arrays.merge)”,它应该打印结果 123456。这可能吗?抱歉,如果我问了一些愚蠢的问题,但我是 javascript 新手,并且来自 java 世界的更多内容。正如我上面提到的,如果我用 reduce 函数上的直接数组调用替换它,它会按预期工作,但我无法使用“this”进行动态操作。
  • 不,没关系。永远不要因为问而感到难过!但据我所知,如果不修改 Array 构造函数,这是不可能的,而且我不完全确定你能做到这一点。您需要将其作为可以调用的函数。但是,我可以问用例吗?调用console.log(theArray.merge()) 与调用console.log(theArray.merge) 有什么不同吗?你追求的用例是什么?
  • 我可以使用方法而不是变量,这很好,但想知道这对 javascript 有什么影响。下面的代码在执行下面的代码时工作正常,但如果我通过它它就不起作用。 Array.prototype.merge = merge = [1,2,3,4,5,6].reduce(function(arg1,arg2) { return arg1+arg2; },[]);数组 = [1,2,3,4,5,6]; console.log(arrays.merge);
  • 那么,我的答案是否已被接受,是您正在寻找的答案吗?还是你还不清楚?不明白你的意思。 :)
  • 是的。答案很完美。谢谢你。但只是想知道这对 javascript 有什么影响。下面在执行下面的代码时工作正常,但如果我通过“this”代替它就不起作用。 Array.prototype.merge = merge = [1,2,3,4,5,6].reduce(function(arg1,arg2) { return arg1+arg2; },[]);数组 = [1,2,3,4,5,6]; console.log(arrays.merge);
【解决方案2】:

使用 Object.defineProperty - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Object.defineProperty(Array.prototype, 'merge', {
  get: function() { return this.join(''); },
  enumerable: false,
  configurable: true
});

或者 - 使用reduce

Object.defineProperty(Array.prototype, 'merge', {
  get: function() { 
    return this.reduce(function (arg1, arg2) {
      return arg1 + arg2;
     }, []); 
  },
  enumerable: false,
  configurable: true
});

此代码将允许您执行您在几个 cmets 中所说的操作

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

而不是

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

【讨论】:

  • 甜蜜。有趣的是我可以定义这样的属性。谢谢@JaromandaX
  • 顺便说一下,特别是对于数组,拥有enumerable: false 是最重要的 - 否则一些在数组上使用for...in 的(旧的和愚蠢的)库将以有趣的方式失败(我正在寻找在你telerik
【解决方案3】:

我会像这样向Array.prototype 添加一个合并函数:

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


var arrays = [1, 2, 3, 4, 5, 6];
console.log(arrays.merge());

更多关于 Javascript here 中的 this 关键字。

【讨论】:

  • 感谢您回答这个问题。我能够使用函数使这个工作,但这不是我想要在这里做的。我想做“consol.log(arrays.merge)”,它应该打印结果 123456。这可能吗?正如我上面提到的,如果我用 reduce 函数上的直接数组调用替换它,它会按预期工作,但我无法使用“this”进行动态操作。
猜你喜欢
  • 2021-10-04
  • 2019-01-13
  • 2015-01-18
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
相关资源
最近更新 更多