如果我有一个对象:
A = {a:true}
为什么我必须使用:
Object.keys(A)
而不是:
A.keys()
如果key是Object的方法,并且所有内容都从Object继承,那么A不应该能够调用键吗?
答案 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。真实的次数是如此之低,以至于这种建议被认为是不太好的做法。