0

Mootools クラスがあります。

var Foo = new Class({
    initialize: function(param1, param2) {
        // do stuff
    }
});

Foo を初期化する値は配列にあります。

a = ['value1', 'value2'];

の値を使用してaのインスタンスを初期化するにはどうすればよいFooですか?

4

2 に答える 2

3

クラスのプロトを拡張して、気にしないようにします(フェリックスの回答を参照)。

var Foo = new Class({
    initialize: function(param1, param2) {
        console.log(param1, param2);
    }
});

(function(){
    var oldFoo = Foo.prototype.initialize;
    Foo.implement({
        initialize: function(){
            var args = typeOf(arguments[0]) == 'array' ? arguments[0] : arguments;
            return oldFoo.apply(this, args);
        }
    });
}());


new Foo(['one', 'two']); // one two
new Foo('three', 'four'); // three four

特別なコンストラクターの抽象化を作成するよりも、ハッキングが少なく、おそらく理解しやすく、維持しやすいでしょう。

できれば、することもできます

var Foo2 = new Class({
     Extends: Foo,
     initialize: function () {
         var args = typeOf(arguments[0]) == 'array' ? arguments[0] : arguments;
         this.parent.apply(this, args);
     }
});

new Foo2(['one', 'two']);
new Foo2('three', 'four');

したがって、親のプロトと期待を変更せずに非常に明確な抽象化を作成し、厄介なSOLID原則を嫌いな人を幸せに保ちます:D

于 2013-01-28T21:27:36.363 に答える
2

で行うように、展開する引数の配列を使用してコンストラクターを呼び出す直接的な方法はありませんFunction.apply

を使用してクラスの新しいインスタンスを作成するとnew Foo()、MooTools はコンストラクター ( initialize) を呼び出し、 Foo() を呼び出した引数を暗黙的に渡します。ただし、initializeインスタンスのメソッドとして引き続き存在するため、次のように単純に「もう一度」呼び出すことができます。

var myFoo = new Foo();
myFoo.initialize.apply(myFoo, ['value1', 'value2']);

しかし、コンストラクターは通常 2 回呼び出されることを意図しておらず、問題が発生する可能性があるため、これは本当に悪い習慣です。

もう 1 つの方法は、MooTools にコンストラクターを呼び出させずにインスタンスを作成することです。最初にプレーンなインスタンスが必要で、次にインスタンスinitializeのメソッドとして呼び出します。これはかなりハックですが、次のように実現できます。

var Foo = new Class({
    initialize: function(param1, param2) {
        this.param1 = param1;
        this.param2 = param2;
    },
    getParams: function() {
        console.log(this.param1 + ', ' + this.param2);
    }
});

Class.createInstance = function(klass, args) {
    klass.$prototyping = true;
    var inst = new klass();
    klass.$prototyping = false;
    inst.initialize.apply(inst, args);
    return inst;
}

var myFoo = Class.createInstance(Foo, ['a', 'b']);

// returns "a, b"
myFoo.getParams();

$prototypingMooTools がコンストラクターを呼び出さないためのスイッチです。

于 2013-01-28T15:43:34.270 に答える