2011-06-23 1 views
1
base = function() { 
    this.A = function() { 
    this.B(); 
    } 
    var C = function() { 
    alert('I am C'); 
    } 
} 

sub = function() { 
    this.B = function() { 
    C(); 
    } 
} 

sub.prototype = new base(); 

(new sub()).A(); 

B()の呼び出しで、基本クラスに関して評価する方法を教えてください。 (つまり、基本クラスのcを呼び出す)これは不可能ですか?javacriptのベースクラススコープ内でサブクラスメソッドを評価する

+0

http://jsfiddle.net/alnitak/DaSEN/を参照してください? – ninjagecko

+0

これは、Cがインスタンス上で呼び出されることを可能にするか、本質的にそれを公開することを可能にします。それがヘルパーメソッドであるはずだから、公開される理由はありません。私の主な不満は、ヘルパーメソッドがサブクラスによって継承できないということです。 –

答えて

2

通常、私はmyFunc.applymyFunc.evalをお勧めします。それは私がjavascriptの "基本クラスに関して"と解釈するものです。

あなたのタイトルに基づいて、あなたは "ベースクラスのスコープ内"と言います。私があなたがクロージャーについて話していて、外部関数の変数を参照できると仮定しているのなら、これは不可能です。おそらく、eval-styleというリクエストを渡すことができるクロージャーにエントリーポイントを置くことを除いて...それで、this._private.Cのようなオブジェクトを持っているかもしれません。

あなたは物事を "プライベート"にしようとしているのなら、それは本当にjavascriptでそうするのは価値がありません。

モチベーションがthis.C = function(){...}で、this.C()と表示されている場合は、より明確な回答をすることができます。

「それを公開し、本質的に/ Cは、インスタンス上で呼び出すことができるようになる。ヘルパーメソッドことになっているので、それを露出するために理由はありません。私はあなたが私の主な不満は、そのヘルパーであると言うことができると思いますメソッドはサブクラスによって継承できません。 "--OP

この場合、実際にはプライベートではありません。しかし、あなたができることは、それが所属するヘルパーメソッドを定義することです:適切には外側のスコープ内にあります。 =)例:

(function(){ 

    var C = function() { 
    alert('I am C'); 
    } 

    base = function() { 
    this.A = function() { 
     this.B(); 
    } 
    } 

    sub = function() { 
    this.B = function() { 
     C(); 
    } 
    } 

})(); 

sub.prototype = new base(); 

(new sub()).A(); 
+0

はい、呼び出すと適用は、プロトタイプオブジェクトのメソッドを呼び出すためのキーです – YODA

+0

@ninjagecko あなたは、天才です(または多分私はまだjavascript初心者です)。その外側のスコープはまさに私が探していたものでした。 –

+0

@jiaweihli:問題はありませんが、私はまだjavascriptで内部を隠すことについてあまり重視しないことを勧めます。やや関連して、初心者ではないようだが、最も一般的なjavascriptの落とし穴に気づくべきである。もしあなたが '.map'や' $ .each'や 'for'で何らかの反復を行うならば関数ごとに1つの名前を持つ変数が1つしか作成されないため、匿名関数を記述する必要があります。ループ内でコールバックを定義すると、これはしばしば注目されます。 – ninjagecko

1

少なくとも、基本クラスを変更してはいけません。

Cは同じ範囲内定義された他の方法によって呼び出されるときにのみ表示され、base字句範囲を有しています。現在、実際にのプライベートメソッドです。

Cは、var Cの代わりにthis.Cと宣言されている場合にのみ、そのレキシカルスコープの外でアクセスできます。

は、あなたがしたくない特別な理由が `this.C =機能(){...}`と `this.C()`としてそれを呼び出すあり

+0

A()を評価している間にC()にアクセスできるのは、基底クラスのスコープに入っているので、何とか皮肉なようですが、this.B()を呼び出すときプロトタイプチェーンを戻ってくるので、より長いアクセス。 –

+0

@jiaweihliそれはちょうどそれが動作する方法です - JavaやC++のプライベートメソッドと同等のものとして 'C'を考えると同じ問題があります。 – Alnitak

関連する問題