我想他们不希望有太多属性,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
可能是灾难性的。