2011-12-10 16 views
1

... status()メソッドが存在しないと、私はそうのようなreturn { ... }を削除した場合、私は、しかし:(それを呼び出すことはできません...オブジェクトのプロトタイプチェーン呼び出し可能メソッドはいつですか?

var org = {}; 

org.Organization = function() { 

    var app = null; 
    function setupApplication() {}; 

    return { 
     init : function() { 
      console.log("init"); 
     } 
    } 
}; 

org.Organization.prototype = { 
    status : function() { 
     console.log("status"); 
    } 
}; 

var myOrg = new org.Organization(); 
myOrg.init();  // outputs "init" 
myOrg.status(); // TypeError: Object #<Object> has no method 'status' 

...このコードを考えてみましょう

var org = {}; 

org.Organization = function() { 

    var app = null; 
    function setupApplication() {}; 
}; 

org.Organization.prototype = { 
    status : function() { 
     console.log("status"); 
    } 
}; 

var myOrg = new org.Organization(); 
myOrg.init();  // TypeError: Object #<Object> has no method 'init 
myOrg.status(); // outputs "status" 

...その後return { ... }が上書きされたりしていますか?オリジナルのオブジェクトがreturn { ... }を持っていない場合にのみ、なぜプロトタイプチェーン上のメソッドを呼び出すことができますか?status()方法は存在しないと私は何の問題もなく、それを呼び出すことができます。なぜこれが起こっていますプロトタイプchaのメソッドよりも優先されるに?

答えて

4

関数コンストラクタでreturn objを使用すると、内部で構築されたオブジェクトではなく、実際のオブジェクトが返されます。あなたはそれが正常に動作したい場合は、単にそのようなコンストラクタ内のinitを定義します。

this.init = function() { }; 

をいくつかの詳細を与えるために:あなたはnew Funcを呼び出すときに、どのような内部で起こることにしたプロトタイプを持つ、新しいオブジェクト(あります関数のプロトタイプ)が作成され、オブジェクトがthisに設定されたコンストラクタ関数が呼び出されます。コンストラクタの最後では、別のオブジェクトを手動で返さない限り、同じオブジェクトが返されます。その場合、そのオブジェクトは返されますが、明らかに同じプロトタイプは返されません。

+0

+1オハイオ州...それは多くの意味があります!ありがとうございます:) – Hristo

+0

喜んでそれが助け! – deviousdodo

関連する問題