如何在Javascript中扩展内置对象,例如Math?

时间:2017-12-27 21:32:16

标签: javascript binding bind

正在学习致电,申请,绑定三人。

然后尝试了这个:

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; }"

为什么此输出包含与sum输出相关的函数定义?

我们如何使用这样的实用方法在项目中扩展像Math这样的内置对象并全部使用它?

谢谢:)

3 个答案:

答案 0 :(得分:3)

这是一个典型的例子,说明为什么你不惹你__proto__(除非你绝对知道你正在做什么)。将函数作为可枚举属性附加到Object.prototype会导致它在for...in循环中进行迭代,因为Array扩展了Object。这会导致函数连接到您的总和并强制转换为字符串。

如果您想为Math添加功能,大多数情况下,您只需直接分配到Math

Math.sum = function() {...}

答案 1 :(得分:1)

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));




答案 2 :(得分:1)

最好以与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]));