我想知道如何使第二个脚本返回与第一个脚本相同的值(通过修改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 */
我在这里看了很多问题,但我没有找到答案。
答案 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);