我想他们不希望Object.prototype 上有太多属性,因为您自己的属性可能会影响它们。
它们包含的越多,发生冲突的可能性就越大。
如果keys 在prototype 上,那么获取此对象的密钥将非常笨拙...
var myObj: {
keys: ["j498fhfhdl89", "1084jnmzbhgi84", "jf03jbbop021gd"]
};
var keys = Object.prototype.keys.call(myObj);
一个介绍潜在阴影属性如何破坏代码的示例。
对于为什么向Object.prototype 添加新属性很重要,似乎有些困惑。
一点也不难想象存在这样的代码......
if (someObject.keys) {
someObject.keys.push("new value")
else
someObject.keys = ["initial value"]
很明显,如果您将keys 函数添加到Object.prototype,此代码将会中断。 someObject.keys 现在将成为一个阴影属性这一事实破坏了编写的代码以假设它不是一个阴影属性。
事后看来是 20/20
如果您想知道为什么 keys 不是原始语言的一部分,那么人们至少会习惯于围绕它进行编码......好吧,我猜他们认为没有必要,或者根本没有没想到吧。
语言中没有包含许多可能的方法和语法特性。这就是我们对规范进行修订以添加新功能的原因。例如,Array.prototype.forEach 是后期添加。但他们可以将其添加到Array.prototype,因为它不会破坏Array 的正确使用。
一种语言应该在其1.0 版本中包含所有可能的功能并不是一个现实的期望。
由于Object.keys 只是返回一个对象的可枚举属性的数组,因此这是一个非必要的添加,可以通过现有的语言特性来实现。它没有更早出现也就不足为奇了。
结论
将keys 添加到Object.prototype 肯定会破坏遗留代码。
在 JavaScript 这样非常流行的语言中,向后兼容性肯定是一个重要的考虑因素。此时向Object.prototype 添加新属性可能会带来灾难性的后果。