Ответ 1
Это, чтобы избежать коллизий - в общем, проблемы с объектами, которые не имеют свойства со значением, которое вы ожидаете.
Объекты в JS часто используются в качестве карт-значений ключей, а ключами могут быть произвольные строки - например, __defineGetter__
, hasOwnProperty
или что-то менее специальное. Теперь, когда вы хотите вызвать такую функцию на неизвестном объекте - например, hasOwnProperty
часто используется в общих функциях перечисления, где любой JSON может быть передан, вы никогда не можете быть уверены, есть ли у вас перезаписанное свойство (это может даже не быть быть функцией) или оригинал, который вы хотите, или же объект наследует свойство вообще. Чтобы избежать этой проблемы (или этой ошибки IE), вам придется использовать Object.prototype.hasOwnProperty.call
- это уродливо.
Таким образом, использование имен всех этих функций на Object
полезно, это более чистый API, который отделяет методы отражения от интерфейса приложения объекта. Это также помогает оптимизировать (упрощает статический анализ) и упрощает ограничение доступа к API отражения в песочницах - по крайней мере, это была идея .
Вы можете быть счастливы, если в прототипе будет defineProperty
, но вы можете безопасно использовать его при работе с известными объектами. Если вы все еще это хотите (как вы знаете, когда использовать, а когда нет), вы можете использовать
Object.defineProperty(Object.prototype, "defineProperty", {
writable: true,
enumberable: false,
value: function(prop, descr) {
return Object.defineProperty(this, prop, descr);
}
});