2012-04-02 3 views
0

私はこのようなコードを持っていますサブクラス?単純に公開方法にする唯一の方法はありますか?プロトタイプは

#########

OKですので、subClassがbaseClassの外側になるようにコードを再配置しました。私はbaseClassを渡すので、subClassは引き続きbaseClassのインスタンスのプロパティにアクセスできます。

var baseClass = function() { 
    var base = this; 
    this.property_a = 1; 
    this.property_b = 5; 

    var sub = new subClass(base); 
    // CODE 
} 

var subClass = function(parent) { 
    var sub = this; 
    this.property_c = 1; 
    this.method_a = function() { 
     return sub.property_c + parent.property_a; 
    } 
    // MORE CODE 
} 

これは結構ですと動作しますが、今私はプロトタイプを使用してメソッドを追加する際の新たな問題を抱えている:

subClass.prototype.method_b = function(){ 
    return sub.property_c + parent.property_b; 
} 

私は親が定義されていないというエラーを取得します。

私は基本的に2つの側面、閲覧側と編集面を持つかなり単純なWebアプリケーションを持っています。表示に必要なものがすべて含まれた基本クラスを作成し、編集に必要なメソッドを別のファイルに追加して、ユーザーが編集ページにあるときにのみ読み込まれるようにします。

+0

baseClassの内部からsubClass.prototype.newMethodを実行するだけです。私はそれがgilly3の答えだと思う。個人的に、私はなぜあなたが 'クラス'の定義に続いてメソッドを追加しなければならないのかわかりません、どうしてJavaScriptを複雑にしなければならないのですか?これは、手順を定義するのとは対照的に、手続き的にクラスを作成するようなものです。 –

答えて

1

なぜサブクラスを基本クラスに宣言していますか?私には意味がありません。

サブクラスのプロトタイプをあなたのスコープに追加することができます。あなたのコードでは、

var baseClass = function() { 
// CODE 
    var subClass = function() { 
     // MORE CODE 
    } 
    subClass.prototype = { 
     ... 
    } 
} 

だろう。しかし、私は、基本クラスのコンストラクタの外に置くことをお勧めしたいです。あなたには、いくつかの理由のために、それは民間たい、クロージャを追加する場合:拡張質問に答えるために

(function(){ 

    baseClass = function() { // public 
     // CODE 
    } 
    baseClass.prototype = {...}; 

    var subClass = function() { // private 
     // MORE CODE 
    } 
    subClass.prototype = Object.create(baseClass.prototype); 
    subClass.prototype.newMethod = function() { ... } 
})() 

EDIT:

ああ、サブクラスが基本クラスから継承しません!私たちは期待していましたが、それ以外の場合はコンストラクタの中に入れても問題ありません。その後、同じプロトタイプが異なるサブクラスのコンストラクタのそれぞれに追加されている可能性:エルス

var subproto = { 
    method_b: = function(){ 
     // manipulate "this" 
    }, 
    ... 
}; 
function baseClass() { 
    // some code 
    function sub() { 
     // is a constructor for subs which belong to this specif base intance 
     ... 
    } 
    sub.prototype = subproto; // the sub constructors of each base instance 
           // have the same prototype 
    var x = new sub(), 
     y = new sub(); // example usage of the sub constructor 
} 
baseClass.prototype = {...} 

あなたは一つの共通のサブコンストラクタ(機能基底クラスの外を)したい場合、あなたはベースインスタンスを与える可能性があり、サブが属しますあなたがしたように、コンストラクタへの引数として。もちろん、サブ(内部メソッドと外部メソッドの両方)は、そのベースインスタンスのパブリックプロパティにのみアクセスできます。

再配置されたコードで間違ったのは、プロトタイプ(「外部」)メソッドがサブコンストラクタの変数parentにアクセスしようとしたことです。あなたが言うように、「親が定義されていないと言うエラー」。

var subClass = function(parent) { 
    var sub = this; 
    this.parent = parent; // make it public 
    this.property_c = 1; 
    this.method_a = function() { 
     return sub.property_c + parent.property_a; 
    } 
    // MORE CODE 
} 
subClass.prototype.method_b = function(){ 
    // prototype functions can only access public properties 
    // i.e. privileged methods, public attributes and other prototype properties 
    return this.property_c + this.parent.property_b; 
} 
+0

しかし、新しいbaseClassインスタンスを構築するために、あなたのサブクラスはどこに必要ですか? – Bergi

+0

?私が答えている間あなたのコメントを削除しないでください: – Bergi

+0

haha​​申し訳ありません私は元の投稿を編集しました。 – synaptomy

0

あなたが本当にプライベートサブクラスを維持したい場合は、クロージャの定義を隠すことができます:

var BaseClass = (function() { 
    function BaseClass() { ... }; 
    function SubClass() { ... }; 
    BaseClass.prototype.foo = function() { ... }; 
    SubClass.prototype.foo = function() { ... }; 
    return BaseClass; 
})(); 

私は個人的には(元の価値があるよりも、閉鎖強制保護のこの種は、多くの問題であることがわかってきました、デバッグがより困難になります)...しかし、それをやりたければ、それはあなたのやり方です。

1

あなたはsubClassを定義するのと同じコンテキスト内のメソッドを定義する必要があります:

var baseClass = function() { 
    // CODE 
    var subClass = function() { 
     // MORE CODE 
    } 
    subClass.prototype.newMethod = function() { ... } 
} 

それができないなら、あなたは適切なコンテキストにsubClassを公開したりするbaseClassからメカニズムを提供する必要があります。拡張subClass