Лучшие практики JavaScript, расширение аборигенов с помощью * statics * - PullRequest
1 голос
/ 26 октября 2011

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 26 октября 2011

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

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

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

Это просто вопрос взвешивания, насколько вы цените эти причины. Я забочусь только о №1 (будущее).

1 голос
/ 26 октября 2011

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

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

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

...