3

javascriptでこのコードを検討してください:

function Selector() {
    this.Status = "";
    this.Groups = new Array();
    this.Errors = new Array();
}

SelectorクラスのGroupsプロパティのメソッドを追加し、それを任意のインスタンスに使用したいと思います。これどうやってするの?

私がこのコードを書いていることに注意してください:

function Selector() {
    this.Status = "";
    this.Groups = []; 
    this.Groups.myFunction = function(){alert(this.length);  
    };
    this.Errors = [];
}

var selector = new Selector();
selector.Groups = [1,2,3];
selector.Groups.myFunction();

しかし、Groupプロパティを設定すると、メソッドの呼び出しでエラーが発生します。

エラー:selector.Groups.myFunctionは関数ではありません

プロトタイプオブジェクトを使用する方法を見つけることを好みます。

ありがとう。

4

2 に答える 2

1

コンストラクターではオブジェクト(配列)をクラスプロパティに割り当て、その特定のインスタンスを拡張しているため、コードはこのようには機能しません。次に、新しい配列を割り当てる場合、その新しく作成された配列にはそのようなメソッドはありません。したがって、ソリューションは次のように変更できます。

function Selector() {
    this.Status = "";
    this.setGroups([]);
    this.Errors = [];
}

Selector.prototype.myFunction = function() {
    alert(this.length);
};

Selector.prototype.setGroups = function(groups) {
    this.Groups = groups;
    this.Groups.myFunction = this.myFunction;
};

var selector = new Selector();
selector.Groups.myFunction();
selector.setGroups([1,2,3]);
selector.Groups.myFunction();
selector.setGroups(['foo', 'bar']);
selector.Groups.myFunction();

デモ

ただし、そのような方法を使用することはお勧めしません。クラスGroupCollectionを作成し、そのプロパティとして配列をカプセル化することをお勧めします。

function GroupCollection(items) {
    this.items = items || [];
}

GroupCollection.prototype.myFunction = function() {
    alert(this.items.length);
};

function Selector() {
    this.Status = "";
    this.Groups = new GroupCollection();
    this.Errors = [];
}

Selector.prototype.setGroups = function(groups) {
    this.Groups.items = groups;
};

var selector = new Selector();
selector.Groups.myFunction();
selector.setGroups([1,2,3]);
selector.Groups.myFunction();
selector.setGroups(['foo', 'bar']);
selector.Groups.myFunction();

<ahref = "http://jsfiddle.net/f0t0n/6gRCH/2/"rel="nofollow">デモ

于 2012-08-13T08:52:47.710 に答える
1

あなたが言う時:

  selector.Groups = [1,2,3];
  selector.Groups.myFunction();

実際には、新しい配列を初期化して、selector.Groupsプロパティに格納していますが、ArrayオブジェクトにはmyFunctionというメソッドがないため、エラーが発生します。

次のように、Arrayオブジェクトを拡張して、すべての配列にmyFunctionメソッドを含めることができます。

  Array.prototype.myFunction = function() { alert(this.length) };

これは良い考えではありませんが、配列をサブクラス化するとIEの長さプロパティが維持されないため、多くのオプションが残されることはありません:(

配列サブクラス化へのiframeハックについては、このリンクを参照してください。

于 2012-08-13T08:59:08.677 に答える