为什么我的对象不继承键功能?

时间:2012-02-15 21:59:24

标签: javascript

如果我有一个对象:

A = {a:true}

为什么我必须使用:

Object.keys(A)

而不是:

A.keys()

如果key是Object的方法,并且所有内容都从Object继承,那么A不应该能够调用键吗?

2 个答案:

答案 0 :(得分:3)

Object.keys是一个所谓的“静态”方法,严格附加于Object函数,而不是其实例。

要将其继承,需要将其定义为Object.prototype.keys

如果您愿意,您当然可以自己添加:

Object.prototype.keys = function () {
    return Object.keys(this);
};

请注意,正如评论中提到的Rocket一样,“拥有”属性优先于prototype属性:

var foo = {};
foo.keys(); // Array of enumerable key names, if any

var bar = { keys: true };
bar.keys(); // TypeError: not a function

答案 1 :(得分:0)

真正的答案是"因为那是ES委员会成员如何设计它的。"但具体而言,对原始问题的第二个评论(由@RobW提供)正是他们想要避免的。


此外,我会要求您删除接受的答案"来自@ JonathonLonowski的回答,因为他显然给出了(并且非常不明智地保护)建议(修改内置原型),大多数网络社区都知道这些建议是糟糕的。修改内置原型的 ONLY 时间就是当你完全确定没有其他代码可以绊倒它时...唯一的时间就是如果您在页面上运行(或将要运行)的所有代码的100%写入,则为true。真实的次数是如此之低,以至于这种建议被认为是不太好的做法。