12

だから私はそれをAと呼ぶことができるクラスを持っています。このクラスのために、私は次のように呼び出すことができるいくつかの関数を書きました:

var a = new A();
a.getSomething();
a.putSomething();
a.delSomething();

等々。今、私はそれを少し整理しようと思ったので、雑然としすぎず、もう少し次のようになります。

a.something.get();
a.something.put();
a.something.del();

そして、これが私がこれを達成しようとした方法です:

A.prototype.something = {
  get: function(){...},
  put: function(){...},
  del: function(){...}
};

しかし、これらの関数 (get、put、および del) は、A にある共通のオブジェクト/関数にアクセスする必要があるため、A への参照が必要ですが、これをどのように達成できるかわかりません。

私が見つけた1つのオプションは次のようになります:

A.prototype.something = function(){
  var that = this;
  return {
    get: function(){...},
    ...
  };
}; 

そして、'this' の代わりに、これらの (get、put、および del) 関数で 'that' が使用されます。しかし、これは、これらの関数を次のように呼び出す必要があることを意味します。

a.something().get();
...

これは私にはあまり良くないようです。では、私が最初に計画した方法でこれらを整理する方法はありますか?

4

3 に答える 3

6

メンバーはすべてのオブジェクトで同じではないため、これをプロトタイプに追加することはできませんsomething。内部的には、そのメソッドは外部オブジェクトへのクロージャーを取得する必要がありますが、これは実行時に取得できません。

コンストラクターでそれを行う必要があります:

function A() {
    var that = this;
    this.something = { 
       get: function(){...}, 
       ... 
    };
}
于 2012-08-30T00:30:13.203 に答える
4

だから私はクラスを持っています

Javascript にはクラスがありません。クラスを限定的にエミュレートできるプロトタイプの継承がありますが、クラスをエミュレートするためだけにそれを行う価値はありません。JavaScript で他の言語をエミュレートしようとするよりも、組み込みの言語機能を最適に使用する方がはるかに優れています。

だからあなたはコンストラクタを持っています...

次のように呼び出すことができるいくつかの関数を作成しました。

var a = new A();
a.getSomething();
a.putSomething();
a.delSomething();

おそらく、これらのメソッドはすべて A.prototype にあります。

等々。今、私はそれを少し整理しようと思ったので、雑然としすぎず、もう少し次のようになります。

a.something.get();
a.something.put();
a.something.del();

それは(私にとって)それほど雑然としていません。何かによって行われる一般的なことがいくつかあると思いますが、そのgetputなどのメソッドは何かでなく操作したいと考えています。

この値は呼び出しによって設定されます。ES5 バインド以外に値を設定する方法はありません。したがって、呼び出されるメソッドは何らかの方法でaにアクセスできる必要があります。他の回答は、クロージャーを使用してそれを行う方法を示していますが、その結果、各インスタンスには独自の何かオブジェクトと添付されたメソッドが必要になります。

以下は似ていますが、クロージャーを取り除きSomething.prototype、少し効率を上げるためにメソッドを配置します。

function A(name) {
    this.name = name;
    this.something = new Something(this);
}


function Something(that){
    this.that = that;
}

Something.prototype.get = function() {
    return this.that.name;
}
Something.prototype.put = function(prop, value) {
    this.that[prop] = value;
}

var a = new A('a');

alert(a.something.get());     // a
a.something.put('name', 'z');
alert(a.something.get());     // z

したがって、それぞれ異なるputgetなどのメソッドを持つ複数のsomethingを持つことができます。しかし、介在する何かのオブジェクトは、実際には、より多くのメモリ (おそらく少量) を使用し、余分な文字を必要とする単なるデバイスです。somethingメソッドをオンにしておく方が簡単で、余分なドット (.) を入力する必要はありません。A.prototype

于 2012-08-30T02:31:19.867 に答える
0
function A() {
  this.something = this;
}
A.prototype = {
  get: function(){...},
  put: function(){...},
  del: function(){...}
};

したがって:

a.something.get();
a.something.put();
a.something.del();
于 2012-09-03T09:43:27.730 に答える