Какие побочные эффекты имеет ключевое слово "новое" в 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 в качестве шаблона для моего плагина, в котором есть этот код.
Ответы
Ответ 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!