Я думаю, что главное преимущество должно быть в состоянии для контроля того, что отображается при перечислении свойств объекта, например for in
или Object.keys()
.
MDN объясняет это хорошо с Object.defineProperty
: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty
Так нормально, когда люди хотят, чтобы добавить метод Object
, такие как polyfill для некоторого метода не поддерживается в старых браузерах, они изменяют .prototype
. Но это делает свойство перечислимым и запутывает то, что возвращается в коллекции циклов/ключей (без использования .hasOwnProperty
... который не каждый использует).
Так вместо того, чтобы что-то вроде:
Object.prototype.myMethod = function() {
alert("Ahh");
};
можно использовать Object.defineProperty
явно сказать, чтобы он не счётна:
Object.defineProperty(Object.prototype, 'myMethod', {
value: function() {
alert("Ahh");
},
enumerable: false
});
Таким образом, например, когда вы используете for (var key in obj)
, «MyMethod «не будет перечисляемым элементом, и вам не придется беспокоиться об использовании .hasOwnProperty
. Основная проблема заключается в том, что некоторые браузеры, конечно, не поддерживают его: http://kangax.github.com/es5-compat-table/ и что не все библиотеки/код используют его, поэтому вы не всегда можете полагаться на внешние библиотеки/код, чтобы правильно использовать и все время.
Вы можете получить доступ к неперечислимому свойству в любое удобное для вас время, оно просто не появится при перечислении свойств объекта - это главное.
И я верю, что все «предопределенные» свойства объектов неперечислимы. Тем самым я действительно имею в виду только собственные свойства, не обязательно унаследованные или созданные. Итак, с вашим примером, pop
и push
будет не перечислить, но Array.prototype.indexOf
будет, если он создан как полиполк в старом браузере, который не поддерживает этот метод ...чего, конечно, можно избежать, используя Object.defineProperty
, как мой пример выше. Другим примером является свойство length
, которое не перечислили.
Вот пример вообще: http://jsfiddle.net/aHJ3g/
Использование и определение Object.keys
имеет важное значение: «Возвращает массив собственных перечислимых свойств данного объекта, в том же порядке, как это предусмотрено в for-in
петле (разность что цикл for-in
перечисляет свойства в цепочке прототипов). " - от MDN - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys
Я думаю, что главное преимущество заключается сделать 'для в' петли сейф - свойство не будет отображаться при переборе над объектом. Может быть, я забываю, что такое перечислимость ... – Ian
Связанные: [Что такое преимущества и опасности добавления методов Object.prototype в Javascript?] (Http://stackoverflow.com/questions/3832617/what-are-the -Преимущества-и-опасности-о-добавляющих-методов-объект-прототип-в-Javas? RQ = 1). –