Что побочные эффекты делает 'новое' ключевое слово, имеют в JavaScript?

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

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

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

У меня не было большой удачи при нахождении информации об этой ошибке JSLint или о любых побочных эффектах это new мог бы иметь.

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

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

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

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

20
задан travis 4 March 2010 в 18:38
поделиться

6 ответов

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

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

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

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

на

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

успокоит JSLint, как вы обнаружили.

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

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

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

Еще немного предыстории :

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

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

7
ответ дан 30 November 2019 в 00:13
поделиться

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

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

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

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

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

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

15
ответ дан 30 November 2019 в 00:13
поделиться

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

jQuery.fasterTrim(this, options);

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

6
ответ дан 30 November 2019 в 00:13
поделиться

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

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

var x = new SomeConstructor();

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

SomeMethod();

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

new SomeCosntructor(args);

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

5
ответ дан 30 November 2019 в 00:13
поделиться

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

$.fasterTrim(this, options);
2
ответ дан 30 November 2019 в 00:13
поделиться

Из Исходный код jQueryfastTrim :

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

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

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

0
ответ дан 30 November 2019 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: