11

このような変数を定義するとします

var today = Date();
console.log(today.getMonth()); // Throw Error

一方、Error クラスのような他のクラスは、new 演算子なしでメソッドを呼び出します。

function factorial(x) {
 if(x <= 1)
   throw Error("x must not be negative");
 return x*factorial(x-1);
}

また、ラッパー オブジェクト (数値、ブール値、文字列) は、new 演算子なしでメソッドを呼び出すことができます。したがって、メソッドを呼び出す前に新しい演算子またはオブジェクト作成手法が必要なクラスはこれだけですか。

編集: Date() は文字列型であるため、オブジェクトを作成せずにメソッドを呼び出す必要があります。文字列型はオブジェクトのように振る舞うからです。では、なぜですか?

編集2new Date() :これは、他の機能(Array(), String(), Error()など)と同じにすることができない唯一のコア機能だと思います。というわけで、これもこの言語の隠れた機能か ECMAScript の間違いです。

4

3 に答える 3

11

ECMAScript 言語仕様

ECMAScript 仕様(Javascript のベース) によると:

Date がコンストラクターとしてではなく関数として呼び出されると、現在の時刻 (UTC) を表す文字列が返されます。

注 関数呼び出し Date(…) は、同じ引数を持つオブジェクト作成式 new Date(…) と同等ではありません。

参考:http ://www.ecma-international.org/ecma-262/5.1/#sec-15.9.2

コンストラクターの呼び出しと関数の呼び出し

new新しいDateオブジェクトを作成しているため、 が必要です。単純に Date() を呼び出すということは、Date() を文字列として返す関数を呼び出すことを意味します。

参照: http://www.javascripture.com/Date

Date() : String
Returns a string representation of the current date and time.

Array や Error などの他の型の場合、関数は新しいオブジェクトを作成して返すファクトリ関数です。

見る:

于 2013-05-14T13:08:11.850 に答える
3

JavaScript コンストラクター関数が呼び出された場合と呼び出された場合で異なる動作をすることは完全に有効ですnew。これは、Dateなしで呼び出されたときに日付を文字列として返し、 付きで呼び出されたnewときに完全なオブジェクトとして返す関数の場合ですnew

于 2013-05-14T13:16:44.423 に答える