Лучшие практики JavaScript, расширение исходных кодов с помощью * статики *

Некоторые люди скажут вам, что добавление прототипов к исходным версиям JavaScript - зло. Например:

String.prototype.format = function(format, replacements) {
    ...
};

Теперь, для тех, кто согласен с этим (если вы этого не сделаете, не отвечайте, ваше мнение N / A; это не обсуждение прототипов), мы добавляем static методы для коренных жителей в равной степени как зло? (До сих пор и далее «статический» означает просто метод, контекст которого не является экземпляром.)

Например, учитывая, что создание String.prototype.format - зло, приемлемо ли добавлять его в качестве статики?

String.format = function(format, replacements) {
    ...
};

Чем расширение нативного кода с помощью статического метода отличается с точки зрения передового опыта, чем расширение нативного кода с помощью прототипа? Либо вы каким-либо образом против расширения аборигенов, либо вы не видите кого-нибудь в лагере, что статические расширения приемлемы, а прототипы - нет?


person user979672    schedule 26.10.2011    source источник
comment
Одна из основных причин та же, что и при расширении прототипа: вы расширяете чужой объект (ы). В больших, длительных проектах с большим количеством (постоянно меняющихся) людей вы обычно хотите избежать этого и использовать четко определенные интерфейсы между кодом разных людей (или команд). Потому что, если вы этого не сделаете, вы попадете в чистилище, если не прямо в ад. выше ничтожно мало - как вы узнаете, если когда-нибудь будете работать над таким большим проектом. Так...   -  person Mörre    schedule 26.10.2011
comment
... хотя есть несколько технических ответов, наиболее важный (с точки зрения индустрии, отдельному программисту на jQuery для небольших проектов наплевать) - это люди и менеджмент. Если вас не волнует этот аспект, вы открыты для гораздо большего количества правильных ответов.   -  person Mörre    schedule 26.10.2011


Ответы (2)


Спросите себя, почему распространение туземцев - это зло.

Общие причины:

  • Не на будущее, что, если в стандартах сказано: «Должен быть String.format»
  • Не доказано, что добавление перечислимых свойств к прототипам сломает плохой код.
  • может привести к путанице относительно того, что является общим, а что стандартным
  • может сломать плохой код (утиная печать, похоже на утку, крякает, как --- выдает исключение :()

Просто нужно взвесить, насколько вы цените эти причины. Меня волнует только №1 (готовность к будущему).

person Raynos    schedule 26.10.2011

Добавление статического метода в собственный конструктор вряд ли окажет неожиданное влияние на чужой код или время, необходимое для создания объектов с использованием указанного конструктора.

Однако, когда вы добавляете метод прототипа в собственный конструктор, каждый экземпляр (даже те, которые созданы для выполнения таких операций, как "test" .indexOf ("t")) будут иметь дополнительные накладные расходы вашего метода. Итерация свойств объекта или возможностей тестирования (поскольку мы часто не можем судить об объекте по его типу) становится более трудной.

Допустим, вы добавили String.prototype.forEach в свой код. Это попадет в каждый модуль. Теперь, когда другой код проверяет метод forEach (считая его массивом в современном браузере), они вместо этого получат строку - зло.

person AutoSponge    schedule 26.10.2011
comment
Почему на 2 очка выше? Было очень ясно, что проблема прототипа уже известна! - person Mörre; 26.10.2011