2012-03-15 4 views
1
function A() { 
    this.B = function() { 
     var bla; 
    }; 
} 
A.B.prototype.foo = function() {console.log("Do whatever");}; 

私はこれを取得:JavaScriptのグローバルスコープで内部関数のプロトタイプに関数を追加する方法は?

TypeError: Cannot read property 'prototype' of undefined

この場合にはBのプロトタイプに関数を追加する方法は?

function A() { 
    this.B = function() { 
     var blah; 
    }; 
} 

a = new A(); 
a.B.prototype.foo = function() {console.log("Do whatever")}; 

あなたの最初の問題をやっていた:

+2

呼び出し後の割り当ては決して不可能です。 'A.B'を設定したい場合は、代わりに' A.B = ... 'を実行してください。 – pimvdb

+0

JavaScriptで 'this'がどのように動作するかを理解していますか?他の言語に精通している場合は、想定している言語とは異なる可能性があります。 –

答えて

3

は、ここではどのようにある...我々のコードでミスがいくつかあります

有効なコードではありません
this.B() = function... 

、あなたはメソッドを呼んでいたので、 Bとそれを機能させるには、属性を参照する必要がありました。

あなたの他の間違いは、 "A"オブジェクトをインスタンス化していなかったので、それ自身ではオブジェクトとして使用できず、呼び出すことができます。あなたが持っていたときにその理由があります:

A.B.prototype 

あなたはそのエラーメッセージを受け取りました。

私はあなたのために物事を少しクリアすることを望む、あなたが疑問を持っているかどうかを教えてください。

+0

ありがとうございます。私はまだインタプリタなしで完璧なJavaScriptを書くことに慣れていない。 :)さらに、私は最初にAのインスタンスを使用してBに到達することを避けたいと思っていました。この場合、AのインスタンスなしでBのプロトタイプに追加することはできません。 – MD3Sum

+0

'a.B.prototype.foo'は実際には機能しません。 http://jsfiddle.net/pLMvE/あなたが 'new a.B'をしていない限り。 –

+0

コメント作成プロセス中に回答したときのコメントへの追加: もう一度ありがとうございます。それは理にかなっていますが、私が気づいていなかったJavascriptの魔法があるかどうかは疑問でした。乾杯。 ps>サンプルコードエラーが修正されました。 – MD3Sum

0

BAのプロパティで、Aのインスタンスからのみアクセスできます。

var aObj = new A; 
aObj.B(); 

あなたはAのインスタンスを使用せずにA.Bにアクセスすることはできません。

aObj.B.prototypeにアクセスし、その方法を追加できます。

aObj.B.prototype.foo = function(){ 
    return 'test'; 
}; 
var bar = new aObj.B; 
console.log(bar.foo()); // 'test' 

var bObj = new A; 
var foobar = new bObj.B; 
console.log(foobar.foo()); // `foo` is undefined 
0

あなたは、あなたがのインスタンスのための即時の必要性なしOuter.prototype.Inner.prototype使って、内部オブジェクトに機能を追加することができ、外側のプロトタイプにそれを追加することで、内部の機能にアクセスできるようにする必要があります外側の物体。

function A() {this.a="a";} 
A.prototype.B = function() {this.b="b";} 
A.prototype.B.prototype.foo = function() {console.log("b is:"+this.b);} 
var a=new A(); 
var b=new a.B(); 
b.foo(); 
関連する問題