Какие побочные эффекты имеет ключевое слово «новый» в JavaScript? - PullRequest
20 голосов
/ 04 марта 2010

Я работаю над плагином для jQuery и получаю эту ошибку JSLint :

Problem at line 80 character 45: Do not use 'new' for side effects.

(new jQuery.fasterTrim(this, options));

Мне не повезло найти информацию об этом JSLintошибка или любые побочные эффекты, которые new могут иметь.

Я пробовал Googling для "Не используйте 'new' для побочных эффектов".и получил 0 результатов. Binging дает мне 2 результата, но оба они просто ссылаются на источник JSLint.Надеюсь, этот вопрос изменит это.: -)

Обновление № 1: Вот еще источник для контекста:

  jQuery.fn.fasterTrim = function(options) {
    return this.each(function() {
      (new jQuery.fasterTrim(this, options));
    });
  };

Обновление № 2: Я использовал Стартовый генератор плагинов jQuery в качестве шаблона для моего плагина, в котором есть этот код.

Ответы [ 6 ]

15 голосов
/ 04 марта 2010

Сам JsLint дает вам причину:

Конструкторы - это функции, которые предназначен для использования с новым префикс. Новый префикс создает новый объект на основе функции прототип, и связывает этот объект с функция подразумевает этот параметр. Если вы не используете новый префикс, новый объект не будет сделан, и это будет привязан к глобальному объекту. Это серьезная ошибка.

JSLint обеспечивает соблюдение соглашения, согласно которому функциям конструктора будут даны имена с начальной заглавной буквы. JSLint делает не ожидайте увидеть функцию вызов с заглавными буквами имя, если у него нет нового префикса. JSLint не ожидает увидеть новый Префикс используется с функциями, имена которых не начинайте с начальных прописных букв. Это можно контролировать с помощью newcap опция.

JSLint не ожидает увидеть Обертка формирует новый номер, новую строку, новый логический.

JSLint не ожидает увидеть новое Объект (используйте {} вместо).

JSLint не ожидает увидеть новое Массив (используйте вместо него []).

7 голосов
/ 04 марта 2010

Трэвис, я разработчик сайта Starter.

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

Просто изменив команду с

(new jQuery.fasterTrim(this, options)); 

до

var fT = new jQuery.fasterTrim(this, options);

успокоит JSLint, как вы нашли.

Настройка подключаемого модуля Starter соответствует шаблону пользовательского интерфейса jQuery для сохранения ссылки на объект в наборе data для элемента. Итак, вот что происходит:

  1. Новый объект создан (через новый)
  2. Экземпляр присоединяется к элементу DOM с помощью jQuery's data: $(el).data('FasterTrim', this)

Нет никакого смысла для возвращаемого объекта, и, следовательно, var объявление не сделано. Я посмотрю, как изменить объявление и очистить вывод для передачи JSLint из коробки.

Еще немного фона :

Преимущество хранения объекта с использованием data заключается в том, что мы можем получить доступ к объекту позже в любое время, вызвав: $("#your_selector").data('FasterTrim'). Однако, если ваш плагин не нуждается в доступе в середине потока таким образом (имеется в виду, что он настроен за один вызов и не предлагает взаимодействия в будущем), то сохранение ссылки не требуется.

Дайте мне знать, если вам нужна дополнительная информация.

6 голосов
/ 04 марта 2010

Жалуется, потому что вы звоните "new", но потом выбрасываете возвращенный объект, я уверен, что Почему этот код использует «новый»? Другими словами, почему это не просто

jQuery.fasterTrim(this, options);

edit Хорошо, хорошо, что инструмент «Стартер» генерирует код таким образом, потому что он действительно хочет создать новый объект, и да, он действительно использует побочные эффекты. Код конструктора, который генерирует «Starter», хранит ссылку на новый объект на затронутом элементе с помощью jQuery «data».

5 голосов
/ 04 марта 2010

Вы используете new для выполнения какого-либо действия вместо того, чтобы создать объект и вернуть его.JSLint считает это недопустимым использованием new.

. Вы должны либо использовать его так:

var x = new SomeConstructor();

, либо выполнить какое-либо действие, подобное этому:

SomeMethod();

Но никогда не используйте new для выполнения действия, подобного этому:

new SomeCosntructor(args);

При этом считается, что new используется для побочных эффектов, поскольку вы не используете его для создания объекта.

2 голосов
/ 04 марта 2010

В основном JavaScript, как правило, медленный зверь, поэтому создание нового объекта просто для вызова функции довольно неэффективно. Функция в любом случае статическая.

$.fasterTrim(this, options);
0 голосов
/ 04 марта 2010

С jОчень быстрееОткрытый исходный код :

 * Usage: 
 * 
 * $(element).fasterTrim(options);  // returns jQuery object
 * $.fasterTrim.trim(" string ", options);  // returns trimmed string

Чтобы ответить на вопрос, «Не используйте новое для побочных эффектов» означает:

Не используйте новые для чего конструктор подойдет к своим параметрам но для создания объекта побочные эффекты в конструкторы баааад!

...