Расширение 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.:
Не делайте этого, когда вы работаете с большой командой.