正在学习Call,Apply,Bind trio。
然后尝试了这个:
Math.__proto__.sum = function(arg1){var res=0; for(i in arg1) res+=arg1[i]; return res; };
Math.sum([1,2,3])
//Output: "6function (arg1){var res=0; for(i in arg1) res+=arg1[i]; return res; }"
为什么此输出包含与和输出相关的函数定义?
我们如何使用这样的实用方法在项目中扩展像Math这样的内置对象并将其全部使用?
谢谢 :)
这是一个典型的例子,说明为什么你不捣乱__proto__
(除非你完全知道你在做什么)。将函数附加到Object.prototype
作为可枚举属性会导致它在for...in
循环中迭代,因为Array
扩展了Object
。这会导致函数连接到您的总和并强制转换为字符串。
如果你想为Math
添加功能,为了大多数目的,你可以直接分配给Math
:
Math.sum = function() {...}
JavaScript允许您修改本机对象:
Math.sayHello = function(friend) {
alert('Hello there ' + friend);
}
Math.sayHello('buddy');
当然,当你真正重新定义方法时,这很快就会变得混乱。
Math.ceil = function(x) {
return parseInt(x, 10);
}
console.log(Math.ceil(4.9));
最好以与Math
相同的方式实现Math.max
的方法,该方法接受参数并返回折叠结果。
Math.add = (...args) => args.reduce((a, b) => a + b, 0);
console.log(Math.add(1, 2, 3));
console.log(Math.add(...[7, 8, 9]));
只有ES5
Math.add = function () {
var i = arguments.length,
sum = 0;
while (i--) {
sum += arguments[i];
}
return sum;
};
console.log(Math.add(1, 2, 3));
console.log(Math.add.apply(null, [7, 8, 9]));