Есть различия между ними:
new Date().toString() работает отлично и возвращает текущую дату
new Date.toString()бросает « Ошибка типа: Date.toString не является конструктором »
Это происходит потому, что new Date()и new Dateимеют разный приоритет. Согласно MDN интересующая нас часть таблицы приоритетов операторов JavaScript выглядит следующим образом:
╔════════════╦═════════════════════════════╦═══════════════╦═════════════╗
║ Precedence ║ Operator type ║ Associativity ║ Operators ║
╠════════════╬═════════════════════════════╬═══════════════╬═════════════╣
║ 18 ║ Member Access ║ left-to-right ║ … . … ║
║ ║ Computed Member Access ║ left-to-right ║ … [ … ] ║
║ ║ new (with argument list) ║ n/a ║ new … ( … ) ║
╠════════════╬═════════════════════════════╬═══════════════╬═════════════╣
║ 17 ║ Function Call ║ left-to-right ║ … ( … ) ║
║ ║ new (without argument list) ║ right-to-left ║ new … ║
╚════════════╩═════════════════════════════╩═══════════════╩═════════════╝
Из этой таблицы следует, что:
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()это предпочтительнее.