使用Javascript:为什么Object.keys(someobject),而不是someobj

2019-06-27 00:25发布

我经常得到使用对象键的排列:

Object.keys(someobject)

我很舒服这样做。 据我所知,对象是对象的构造函数,并且键()是它的一个方法,而且键()将返回上任何对象作为第一个参数键的列表。 我的问题不是如何获取对象的钥匙 -请不要与非的答案解释这个答复。

我的问题是, 为什么没有一个更可预测的键()或getKeys()方法,或者键的实例变量的Object.prototype上可用的 ,所以我可以有:

someobject.keys()

或为一个实例变量:

someobject.keys

和返回键的阵列?

同样,我的目的是要理解JavaScript的设计,并取钥匙的有些直观机构用于什么目的。 我不需要帮助,得到钥匙。

Answer 1:

我想回答你的问题是“因为委员会决定,”而现在我已经能听到你问:“为什么?” 这句话结束前。

最近,我读到这一点,但现在我无法找到来源。 它归结为是,在很多情况下,你不得不使用Object.prototype.keys.call(myobject) ,无论如何,因为的可能性myobject.keys的对象已经被用于别的东西。

我想你会发现这个归档邮件线程有趣的,其中,例如布兰登·艾克讨论的ECMAScript 5的新方法的一些方面。

更新:虽然在挖邮件归档 ,我发现这个 :

主题 :如果Object.keys被重新定位为Object.prototype.keys

讨论 :艾伦认为,这是不是一个真正的元层操作,因为它是用于在应用层代码使用作为替代的for..in用于获取枚举属性名称的列表。 作为应用层的方法它属于上Object.prototype中,而不是在对象的构造。 有原则普遍同意,但它是务实由Doug和马克认为,这太可能是用户定义的对象将定义自己的属性命名为“钥匙”,这将影Object.prototype.keys使其无法访问这种应用对象。

动作:保持它作为Object.keys。



Answer 2:

我想他们不希望太多的属性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做无非返回一个对象的枚举自身属性的数组,它是一种非必需此外,可与现有的语言功能来实现。 它应该是毫不奇怪,这是不存在前面。


结论

添加keysObject.prototype肯定打破旧的代码。

在一个非常流行的语言如JavaScript,向后兼容性是肯定将是一个重要的考虑因素。 添加新的属性Object.prototype在这一点上可能被证明是灾难性的。



Answer 3:

随意制作自己的,但更多的属性添加到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


文章来源: Javascript: why Object.keys(someobject), rather than someobject.keys?