JS原型(这个)“点”函数没有本机对象

时间:2016-08-11 11:33:52

标签: javascript

我想知道如何使第二个脚本返回与第一个脚本相同的值(通过修改MyObject),因此我不必扩展本机对象。

基本上,我希望能够将函数作为parameter.functionName()而不是functionName(参数)来调用。

Object.prototype.arraySum = function()
{
  var sum = 0;

  for(var i = 0; i < this.length; i++)
  {
    sum += this[i];
  }

  return sum;
}

console.log([1,2,3,4].arraySum()); /* return: 10 */
function MyObject()
{}

MyObject.prototype.arraySum = function()
{
  var sum = 0;

  for(var i = 0; i < this.length; i++)
  {
    sum += this[i];
  }

  return sum;
}

console.log([1,2,3,4].arraySum()); /* return: [1,2,3,4].arraySum is not a function */

我在这里看了很多问题,但我没有找到答案。

3 个答案:

答案 0 :(得分:1)

数组文字构造了一个floor实例,你怎么可能不会影响它。因此,要使用Array进行此操作,您需要更改调用它的代码。

一个简单的解决方案是包装器:

MyObject

function MyObject(arr) {
    this.array = arr;
}

MyObject.prototype.sum = function() {
    var sum = 0;
    for(var i = 0; i < this.array.length; i++) {
        sum += this.array[i];
    }
    return sum;
};

还有许多其他可转换的方法,但没有一种可以改变console.log(new MyObject([1,2,3,4]).sum()); 不起作用的事实。

答案 1 :(得分:1)

console.log([1,2,3,4].arraySum())

[1,2,3,4]是一个数组,因此继承自Array.prototype,而不是MyObject。因此,如果您真的想拥有parameter.functionName(),那么您必须将arraySum函数添加到Array.prototype

但扩展原生原型并不是一个很好的做法。

所以你可以编写自己的Array类:

function MyArray() {}

MyArray.prototype = new Array(); // all Array method will be available
MyArray.prototype.sum = function() { 
    console.log("My sum function") 
}

var arr = new MyArray(); // it will produce an array-like object
arr.push(1,2,3);
arr.sum() // will log "My sum function"

答案 2 :(得分:0)

https://jsfiddle.net/nuwanniroshana/2qoko562/

Array.prototype.sum = function() {
  var sum = 0;
  this.forEach(function(value) {
    sum += value;
  });

  return sum;
};


var numbers = [1, 2, 3, 4, 5, 6, 7, 8];
var sum = numbers.sum();

console.log(sum);

var floats = [1.3, 85.2, 9.33, 1.24, 24.5, 6];
sum = floats.sum();

console.log(sum);