Почему Object.keys не Object.prototype.keys?

Мне интересно, почему спецификация определила Object.keys вместо Object.prototype.keys? это было бы намного лучше, если бы API был согласован, и я хотел бы понять, почему это не так.

Другие методы находятся на Object.prototype, так почему же это не так?

Ответы

Ответ 1

Потому что вы можете легко переопределить это, указав свой объект с помощью ключа с именем keys, содержащего значение или функцию.

var myObj = { val1:"hi", keys:function(){ return true; } };

Что вы ожидаете получить от myObj.keys()?

Ответ 2

Я бы предположил, что они сделали это, потому что не всегда понятно, что такое ключи, а какие нет, например:

var cls = function() {
    this.IAMAKEY = undefined;
    this.someMethod = function() {};
};

Object.keys(new cls()); // ['IAMAKEY', 'someMethod']

Кстати, добавление Object.prototype.keys возвращает метод ключей:)

Но если вы должны:

Object.defineProperty(Object.prototype, 'keys', {
    writable: false,
    configurable:   false,
    value:          function() {
        return Object.keys(this);
    }
});