【发布时间】:2018-06-08 11:52:42
【问题描述】:
正在学习调用、应用、绑定三重奏。
然后试试这个:
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 这样的内置对象并完全使用它?
谢谢:)
【问题讨论】:
-
你可以说
Math.sum = function () { /* do stuff */} -
@mhodges 结果都是一样的。
-
您需要对数组使用
for...of,而不是for...in。如果您使用for...in,它将获取您的属性和所有原型属性,即 1、2、3 和 sum 函数。它在 sum 函数上调用.toString()并将其连接到对先前属性求和的答案,这就是您获得输出的原因。 -
@mhodges,嘿,Math.sum 工作了。但我正在寻找为什么它不适用于 Math.__proto__.sum 方法的答案。但是 for .. of 不是 ES6+ 的特性吗?
-
@edam 你不想想要将
sum实现为Math.__proto__的成员,首先,因为__proto__是一个特定于实现的属性,并且是不可移植,其次是因为 每个 对象都有一个sum()成员方法是没有意义的。记住Math.__proto__ === Object.prototype,这样你就可以做一些疯狂的事情,比如{}.sum()或[].sum()、/regexp/.sum()甚至0..sum()。
标签: javascript binding bind