Расширение JavaScript-кода Object.prototype
Я не спрашиваю, все ли в порядке:
Object.prototype.method = function(){};
Это считается злом почти всеми, считая, что это беспорядок for(var i in obj)
.
Реальный вопрос
Игнорирование
- Некомпетентные браузеры (браузеры, которые не поддерживают
Object.defineProperty
)
- Потенциал для столкновения свойств или переопределения
Предполагая, что у вас есть полезный метод невероятно, считается ли это неправильным/неэтичным?
Object.defineProperty(Object.prototype, 'methodOnSteriods',{
value: function(){ /* Makes breakfast, solves world peace, takes out trash */ },
writable: true,
configurable: true,
enumerable: false
});
Если вы считаете, что вышеизложенное неэтично, почему бы им даже реализовать эту функцию в первую очередь?
Ответы
Ответ 1
Я думаю, что это нормально, если оно работает в вашей целевой среде.
Также я думаю, что паранойя расширения прототипа раздута. Пока вы используете hasOwnProperty()
, как хороший разработчик, все в порядке. В худшем случае вы перегружаете это свойство в другом месте и теряете этот метод. Но это ваша собственная ошибка, если вы это сделаете.
Ответ 2
Я бы сказал, что это почти так же зло, как раньше. Самая большая проблема, по-прежнему такая же, как и раньше, заключается в том, что Object.prototype является глобальным. Хотя ваш метод может в настоящее время решать мир во всем мире, он может переписать какой-то другой метод (который гарантирует галактический мир) или может быть перезаписан в будущем какой-либо библиотекой, в которой вы не контролируете (следовательно, снова погрузите мир в хаос)
В новых версиях Javascript есть множество функций, связанных с свойствами, таких как определение свойства, которое может быть перечислимым/неперечислимым, с использованием геттеров и сеттеров... Object.defineProperty существует для управления этим.
От Документы Mozilla:
Этот метод позволяет точно добавлять или изменять свойство на объект. Обычное добавление свойства через назначение создает свойства, которые появляются при перечислении свойств (для... в цикле), значения которых могут быть изменены и которые могут быть удалены. Этот метод позволяет изменять эти дополнительные детали по умолчанию.
Эта новая функция в основном необходима для поддержки новых функций, и вы должны использовать ее самостоятельно. Возможность изменять Object.prototype является лишь побочным эффектом его также являющегося "нормальным" объектом и столь же зла, как и раньше.
Ответ 3
Хорошо в "JavaScript: хорошие части", есть аналогичная функция, я думаю, что очень полезно улучшить базовые объекты javascript (например, String, Date и т.д.), но только для этого.
// Add a method conditionally. from "JavaScript: the good parts"
Function.prototype.method = function (name, func) {
if (!this.prototype[name]) {
this.prototype[name] = func;
}
}
Ответ 4
.hasOwnProperty()
исключает итерацию через унаследованные свойства, которые я лично нахожу, часто более раздражает, чем полезно. Это в значительной степени побеждает полезность Object.create()
, что иронично, так как тот же парень, который убедил всех сделать .hasOwnProperty()
, также способствовал Object.create()
.
Object.prototype не следует расширять по причинам, перечисленным здесь. Если вы действительно хотите его расширить, сделайте расширения нетерабеленными.
Я понимаю, что это летит перед всеми опубликованными передовыми практиками, но мы действительно должны прекратить "мандатирование" .hasOwnProperty()
на итерациях ключевых слов объектов и использовать полезность прямого наследования объекта-объекта.
Ответ 5
Короткий ответ: Да, вы должны это сделать.
Прежде чем это сделать, необходимо принять несколько мер предосторожности:
1. используя hasOwnProperty
при итерации объекта, но это не является предосторожностями, когда итерирующий объект, я уже использую hasOwnProperty
в любом случае.
2. проверьте, существует ли name
в Object.prototype.name
, это очень безопасно, чтобы избежать столкновения имен.
3. воспользуйтесь Object.defineProperty()
, просто добавьте дополнительный защитный слой.
Как вы можете видеть, это не очень сложно.
Теперь приходят преимущества, когда вы позаботились о рисках/недостатках:
1. Цепочка метода, это просто делает код более читабельным, кратким и делает кодирование более приятным. В свою очередь, делает вас счастливее, и ваша жизнь проще.
2. решает проблему совместимости с браузером, вы все равно делаете polyfill.
P.S.:
Не делайте этого, когда вы работаете с большой командой.