Існують відмінності між цими двома:
new Date().toString() працює чудово і повертає поточну дату
new Date.toString()кидає " TypeError: 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 (і вище "Function Call"), а вираз оцінюється як(new (Date.toString))()
Така ж логіка може бути застосована і до … [ … ]оператора.
new Fooмає право-наліво асоціативність і для new Foo()"асоціативності" не застосовується. Я думаю, що на практиці це не має ніякого значення. Для отримання додаткової інформації дивіться це запитання щодо ТАК
Чи один віддає перевагу іншому?
Знаючи все це, можна припустити, що new Foo()перевагу.