15

挙動の違いが分かります。Date()現在の日付を表す文字列をnew Date()返し、呼び出し可能なメソッドを持つ Date オブジェクトのインスタンスを返します。

しかし、理由はわかりません。JavaScript はプロトタイプ化されているため、オブジェクトでもあるメンバー関数 (メソッド) を持つDate関数オブジェクトがプロトタイプ化されています。しかし、私はこのように動作する JavaScript を書いたり読んだりしたことがないので、違いを理解したいと思っています。

メソッドを持ち、new 演算子でインスタンスを返し、直接呼び出されたときに String を出力する関数のサンプル コードを誰かに見せてもらえますか? つまり、このようなことがどのように起こるのでしょうか?

Date();                   // returns "Fri Aug 27 2010 12:45:39 GMT-0700 (PDT)"
new Date();               // returns Object
new Date().getFullYear(); // returns 2010
Date().getFullYear();     // throws exception!

非常に具体的な要求、私は知っています。それが良いことであることを願っています。:)

4

2 に答える 2

4

これのほとんどは自分で行うことができます。なしでベア コンストラクターを呼び出してnew文字列を取得することは、ECMA 仕様では特別ですDateが、同様のことをシミュレートできます。

方法は次のとおりです。最初に、コンストラクター パターンでオブジェクトを宣言します (たとえば、呼び出されることを意図し、newそのthis参照を返す関数:

var Thing = function() {
    // Check whether the scope is global (browser). If not, we're probably (?) being
    // called with "new". This is fragile, as we could be forcibly invoked with a 
    // scope that's neither via call/apply. "Date" object is special per ECMA script,
    // and this "dual" behavior is nonstandard now in JS. 
    if (this === window) { 
        return "Thing string";
    }

    // Add an instance method.
    this.instanceMethod = function() {
        alert("instance method called");
    }

    return this;
};

Thing の新しいインスタンスがinstanceMethod()それらを呼び出した可能性があります。モノ自体に「静的」関数を追加するだけです。

Thing.staticMethod = function() {
    alert("static method called");
};

今、あなたはこれを行うことができます:

var t = new Thing(); 
t.instanceMethod();
// or...
new Thing().instanceMethod();
// and also this other one..
Thing.staticMethod();
// or just call it plain for the string:   
Thing();
于 2010-08-27T19:57:29.807 に答える
-1

newオブジェクトの新しいインスタンスを作成するための Javascript (およびその他) のキーワードです。JavaScript の 'new' キーワードとは何ですか? の
重複の可能性があります。. この記事も参照してください: http://trephine.org/t/index.php?title=Understanding_the_JavaScript_new_keyword

于 2010-08-27T19:50:49.037 に答える