0

私は実際に、同じ動作を実装するために一連のオブジェクト (インスタンスではなくクラス) が必要なプロジェクトに取り組んでいます。基本的に、各「クラス」は、その各インスタンスを含む配列を操作する方法を提供する必要があります。

このようなコーディングは私を悩ませます:

function A() { ... }
A.instances = [];
A.someStaticMethod = function () {
    for (var i = 0 ; i < A.instances ; i++) {
        A.instances[i].doSomething();
    }
}
A.prototype.doSomething = function () { ... }

function B() { ... }
B.instances = [];
B.someStaticMethod = function () {
    for (var i = 0 ; i < B.instances ; i++) {
        B.instances[i].doSomething();
    }
}
B.prototype.doSomething = function () { ... }

ある種のコピー/貼り付けのようなコードが好きではありません。クラス言語から来て、私がしなければならないことは、それらの静的メンバー/メソッドを実装し、それから継承する他のクラスを持つ 3 番目のクラスを作成することだけであると自然に考えました。私はほとんど知りませんでした。静的メンバーを継承することはできません。

私は JavaScript がどのように機能するかを学びたいと思っているので、毎回コードを複製することなく、必要な動作を得る方法があるかどうか疑問に思っていました。

4

2 に答える 2

1

関数を使用して、一種のmixin関数を使用してオブジェクトを強化することができます。

function enhanceStatic(type) {
    type.instances = [];
    type.someStaticMethod = function () {
        for (var i = 0; i < type.instances.length; i++) {
            type.instances[i].doSomething();
        }
    };
}

function A(msg) {
    this.msg = msg;
}
enhanceStatic(A);
A.prototype.doSomething = function () {
    console.log("A: " + +this.msg);
}

function B(msg) {
    this.msg = msg;
}
enhanceStatic(B);
B.prototype.doSomething = function () {
    console.log("B: " + +this.msg);
}

A.instances = [new A(1), new A(2)];
B.instances = [new B(1), new B(2), new B(3)];
A.someStaticMethod();
B.someStaticMethod();

出力:

A: 1
A: 2
B: 1
B: 2
B: 3 
于 2013-04-17T20:12:34.370 に答える