我经常得到使用对象键的排列:
Object.keys(someobject)
我很舒服这样做。 据我所知,对象是对象的构造函数,并且键()是它的一个方法,而且键()将返回上任何对象作为第一个参数键的列表。 我的问题不是如何获取对象的钥匙 -请不要与非的答案解释这个答复。
我的问题是, 为什么没有一个更可预测的键()或getKeys()方法,或者键的实例变量的Object.prototype上可用的 ,所以我可以有:
someobject.keys()
或为一个实例变量:
someobject.keys
和返回键的阵列?
同样,我的目的是要理解JavaScript的设计,并取钥匙的有些直观机构用于什么目的。 我不需要帮助,得到钥匙。
我想回答你的问题是“因为委员会决定,”而现在我已经能听到你问:“为什么?” 这句话结束前。
最近,我读到这一点,但现在我无法找到来源。 它归结为是,在很多情况下,你不得不使用Object.prototype.keys.call(myobject)
,无论如何,因为的可能性myobject.keys
的对象已经被用于别的东西。
我想你会发现这个归档邮件线程有趣的,其中,例如布兰登·艾克讨论的ECMAScript 5的新方法的一些方面。
更新:虽然在挖邮件归档 ,我发现这个 :
主题 :如果Object.keys被重新定位为Object.prototype.keys
讨论 :艾伦认为,这是不是一个真正的元层操作,因为它是用于在应用层代码使用作为替代的for..in用于获取枚举属性名称的列表。 作为应用层的方法它属于上Object.prototype中,而不是在对象的构造。 有原则普遍同意,但它是务实由Doug和马克认为,这太可能是用户定义的对象将定义自己的属性命名为“钥匙”,这将影Object.prototype.keys使其无法访问这种应用对象。
动作:保持它作为Object.keys。
我想他们不希望太多的属性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
在这一点上可能被证明是灾难性的。
随意制作自己的,但更多的属性添加到Object
的原型,更高的机会,你会碰撞。 这些碰撞将最有可能打破任何第三方JavaScript库,并依赖于任何代码for...in
循环。
Object.prototype.keys = function () {
return Object.keys(this);
};
for (var key in {}) {
// now i'm getting 'keys' in here, wtf?
}
var something = {
keys: 'foo'
};
something.keys(); // error