2013-07-21 5 views
7
var foo = function() { 
    return new moo(); 
} 

var moo = function() { 
    return this; 
} 

私は文を実行した場合新しい関数は、指定された関数コンストラクタを返すでしょうか?

new foo() 

私は実際にはMOOのインスタンスを得るのだろうか?これは明らかに同時に非直感的に見える。機能的には、これは何が起こるべきかですが、同時に内部を知らない場合はこれは期待できません。

編集:これは直感的ではないようです。 Javaコンストラクタでは何も返せません。

これは、jqueryが使用するコンストラクタパターンと非常によく似ています。

答えて

3

はいあなたはMOOのインスタンスを取得します捨てますにバインドされた新しく作成されたオブジェクトが返された場合。

非直感性は、javascviptコンストラクタでオブジェクト自体以外のものを返すことができるためです。これはすべての関数が実際にjsのオブジェクトであるため可能です。可能なjavaやc#のような言語では、コンストラクタは常にコンストラクタが属するオブジェクトを返します。また、そのような言語で新しいキーワードなしでコンストラクタを呼び出すこともできません。 コンストラクタから何も返さないのは、jsのもの(コンストラクタが使用されていると仮定します)のreturn this;と同じです。

+0

このキーワードが使用されていないためです。 – user2580076

2

あなたは新しいキーワードが使用されるたびので、これはとても曖昧であることの理由はthe newly created object's constructor is not executed until 'this' keyword is used、あるMOO

のインスタンスを取得しますが正しいです。新しいオブジェクトは 'this'キーワードにバインドされています。

からこれを参照してください:コード新しいFOO(...)が実行されると、以下のことが起こるhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

  1. 新しいオブジェクトが作成され、foo.prototypeから継承。
  2. コンストラクタ関数fooは指定された引数で呼び出され、これは新しく作成されたオブジェクトにバインドされます。新しいfooは新しいfoo()に相当する です。つまり、引数リストが指定されていない場合、fooは引数なしで呼び出された です。
  3. コンストラクタ関数によって返されるオブジェクトは、新しい式全体の結果になります。コンストラクタ関数が オブジェクトを明示的に返さない場合、手順1で作成したオブジェクトは代わりに を使用します。 (通常、コンストラクタは値を返しませんが、彼らは通常のオブジェクトの作成 プロセスを無効にしたい場合、彼らは そうすることを選択できます。)

をあなたの例では、あまりにも新しいオブジェクトが作成されますが、 'this'キーワードは使用されていないので、fooのコンストラクタは呼び出されないので、関数はmooオブジェクトを返すだけです。

http://jsfiddle.net/v5aGu/

var foo = function() { 
    return new moo(); 
} 

var moo = function() { 
    return this; 
} 

var myFoo = new foo(2); 
if(myFoo instanceof moo){ 
    alert("moo"); 
} 
if(myFoo instanceof foo){ 
    alert("foo"); 
} 

編集:

  1. コンストラクタのデフォルトの動作は「これを返すことです:@Desu

    id = 0; 
    
    var foo = function(){ 
    
    } 
    
    if(new foo() instanceof foo){ 
    alert("yes"); //alerts yes 
    } 
    

    JavaScriptのコンストラクタ101によって発生した質問に答えるために他に何も返されなければ '

  2. 別のオブジェクトはコンストラクタから「この」

http://jsfiddle.net/xQVuX/1/

id = 0; 

var foo = function(){ 
} 

if(new foo() instanceof foo){ 
alert("foo yes"); //alerts foo yes because foo returns this as a default behavior 
} 

var foo2 = function(){ 
    var i=new foo(); 
    return i; 
} 

if(new foo2() instanceof foo2){ 
alert("foo2 yes");// does not alert because foo2 returns another object and the newly created object is discarded 
} 

var foo3 = function(){ 
    this.i = 10; 
} 

if(new foo3() instanceof foo3){ 
    alert("foo3 yes"); // alerts foo3 yes because foo3 returns this as a default behavior 
} 
+0

@stack_temp 'this'はあなたの質問に答えますか? – user2580076

+0

[link](http://jsfiddle.net/xQVuX/) '新しく作成されたオブジェクトのコンストラクタは' this 'キーワードが使用されるまで実行されません。関数自体はコンストラクタです。実行されない場合、新しいmooも実行されません。 – Desu

関連する問題