Подтвердить что ты не робот

Какие побочные эффекты имеет ключевое слово "новое" в JavaScript?

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

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

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

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

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

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

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

Обновление # 2: Я использовал Starter jQuery plug-in generator в качестве шаблона для моего плагина, в котором есть этот код.

4b9b3361

Ответ 1

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

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

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

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

to

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

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

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

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

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

Немного больше фона:

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

Сообщите мне, если вам нужна дополнительная информация.

Ответ 2

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

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

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

JSLint не ожидает увидеть wrapper формирует новый номер, новую строку, новый Boolean.

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

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

Ответ 3

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

jQuery.fasterTrim(this, options);

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

Ответ 4

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

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

var x = new SomeConstructor();

Или выполните следующие действия:

SomeMethod();

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

new SomeCosntructor(args);

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

Ответ 5

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

$.fasterTrim(this, options);

Ответ 6

Из jQuery fastTrim исходный код:

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

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

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