Я видел объекты, созданные таким образом:
const obj = new Foo;
Но я подумал, что круглые скобки не являются обязательными при создании объекта:
const obj = new Foo();
Является ли первый способ создания объектов действительным и определенным в стандарте ECMAScript? Есть ли различия между первым способом создания объектов и последним? Один предпочтительнее другого?
javascript
new-operator
Бехранг Саидзаде
источник
источник
new a.b()
отличается от тогоnew a().b()
, что в первом случаеa.b
к нему обращаются первыми, тогда как во втором случае сначала создается новоеa
.Ответы:
Цитирую Дэвида Фланагана 1 :
Лично я всегда использую круглые скобки, даже когда конструктор не принимает аргументов.
Кроме того, JSLint может повредить вашим чувствам, если вы опустите скобки. Он сообщает
Missing '()' invoking a constructor
, и инструмент, по-видимому, не может допустить пропуска скобок.1 Дэвид Фланаган: полное руководство по JavaScript: 4-е издание (стр. 75)
источник
new Class
для конструкторов без параметров. Если это не означает «самоуверенный», я не знаю, что значит ...new Object.func()
НЕ эквивалентноnew Object().func()
. Всегда включая круглые скобки, исключается возможность совершения этой ошибки.(new Object).func()
. Но я считаю, что использование лишних скобок и лишних знаков равенства, как в случае с==
vs===
, является плохим оправданием для того, чтобы не изучать ваш язык.Есть различия между ними:
new Date().toString()
работает отлично и возвращает текущую датуnew Date.toString()
бросает « Ошибка типа: Date.toString не является конструктором »Это происходит потому, что
new Date()
иnew Date
имеют разный приоритет. Согласно MDN интересующая нас часть таблицы приоритетов операторов JavaScript выглядит следующим образом:Из этой таблицы следует, что:
new Foo()
имеет более высокий приоритет, чемnew Foo
new Foo()
имеет тот же приоритет, что и.
операторnew Foo
имеет на один уровень более низкий приоритет, чем.
операторnew Date().toString()
работает отлично, потому что он оценивает как(new Date()).toString()
new Date.toString()
выдает « TypeError: Date.toString не является конструктором », поскольку.
имеет более высокий приоритет, чемnew Date
(и выше, чем «вызов функции»), и выражение оценивается как(new (Date.toString))()
Та же логика может быть применена к
… [ … ]
оператору.new Foo
имеет ассоциативность справа налево и дляnew Foo()
«ассоциативности» не применим. Я думаю, что на практике это не имеет никакого значения. Для получения дополнительной информации см этот вопрос такЗная все это, можно предположить, что
new Foo()
это предпочтительнее.источник
new Foo()
следует отдать предпочтениеnew Foo
. Лучший ответ на данный момент.new Object().something()
а также(new Object()).something()
.(new Date).toString()
же количество символов и более явный, чемnew Date().toString
.Я не думаю, что есть разница, когда вы используете оператор «new». Будьте осторожны с этой привычкой, так как эти две строки кода НЕ одинаковы:
источник
Если у вас нет аргументов для передачи, скобки не являются обязательными. Пропускать их - просто синтаксический сахар.
источник
https://people.mozilla.org/~jorendorff/es6-draft.html#sec-new-operator-runtime-semantics-evaluation
Вот часть спецификации ES6, которая определяет, как работают два варианта. Вариант без скобок передает пустой список аргументов.
Интересно, что эти две формы имеют разные грамматические значения. Это появляется, когда вы пытаетесь получить доступ к члену результата.
источник
Там нет никакой разницы между двумя.
источник