2

「疑似古典的継承」スタイルを使用して、JS 継承に頭を悩ませようとしています。私は多くの Google 検索を行い、古典的な記事を読みました。私は Java のクラス構造に精通しており、JS のプロトタイプ スタイルを理解しようとしています。最初に基本を理解したいので、バニラJSを探しています。

単純な親子テスト クラスのセットアップがあり、スコープ ルールに関するヘルプが必要です。

1.) クラス内とクラス外でメソッドを定義するのはいつですか?

2.) プロトタイプ スタイルを使用してメソッドを作成する場合、プライベート変数とプライベート関数にアクセスするにはどうすればよいですか?

function superClass(name){
  this.name = name;
  var privateValue = "I'm Private";
  this.outputPrivate2 = function(){
    alert(privateValue); //works fine
  }      
}

superClass.prototype.outputPrivate = function(){
alert(this.privateValue); //outputs undefined..   
    alert(superClass.prototype.privateValue) //also undefined  
}

3.) 子オブジェクトはどのようにしてプライベート関数を呼び出したり、親のプライベート変数にアクセスしたりできますか?

4.) 子オブジェクトが親コンストラクターを手動で呼び出す必要があるのはいつですか?

subClass2.prototype = new superClass();                // Define sub-class
subClass2.prototype.constructor = subClass2;

function subClass2(name) {
this.name = name;
this.Bye = function() {
return "Bye from subClass - " + this.name;
}   
this.testm = function(){
superClass.prototype.SomeParentMethod.call(this, "arg1", "arg2");
}

}

var parent = new superClass("parent");
var child = new subClass("child1");
parent.outputPrivate(); //undefined
parent.outputPrivate2(); //I'm private
child.outputPrivate(); //undefined
child.outputPrivate2(); //I'm private

コードの 80% が複製された 3 つのオブジェクトがあったため、親オブジェクトと 3 つの子オブジェクトを作成しました。子オブジェクトには、親からのプライベート データを使用および操作するメソッドがあります。これを機能させる唯一の方法は、好きではないすべての変数を公開することです。繰り返しますが、私は Java に精通しているので、JS を Java のように機能させるのは難しいかもしれません。

4

1 に答える 1

3

ここでは、オブジェクト指向 JavaScript のいくつかの興味深い点に取り組んでいます。

1) クラスでメソッドを定義すると、コンストラクターを呼び出すたびに新しい関数が作成されます。多くのオブジェクトを使用すると、パフォーマンスの問題が発生する可能性があります。メソッドをプロトタイプ オブジェクトにアタッチすると、関数は 1 回だけ作成されます。

2) ただし、コンストラクター内で関数を定義する利点は、「プライベート」メソッド/プロパティを使用できることです。Javascript には、実際にはプライベート変数のようなものはありません。代わりに、いくつかの変数を含むクロージャーを作成しています。

これらの変数をコンストラクタの外で使用する必要がある場合は、それらを公開する必要があります。

3) 同じ問題。

4)あなたの質問は完全に明確ではありませんが、私は次のようにします:

function parent(){
    this.a = 1;
}

function child(){
    parent.call(this);
    this.b = 2;
}

obj = new child();
// now obj.a == 1, obj.b == 2
于 2011-02-28T23:09:09.323 に答える