Mootools クラスがあります。
var Foo = new Class({
initialize: function(param1, param2) {
// do stuff
}
});
Foo を初期化する値は配列にあります。
a = ['value1', 'value2'];
の値を使用してa
のインスタンスを初期化するにはどうすればよいFoo
ですか?
Mootools クラスがあります。
var Foo = new Class({
initialize: function(param1, param2) {
// do stuff
}
});
Foo を初期化する値は配列にあります。
a = ['value1', 'value2'];
の値を使用してa
のインスタンスを初期化するにはどうすればよいFoo
ですか?
クラスのプロトを拡張して、気にしないようにします(フェリックスの回答を参照)。
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
で行うように、展開する引数の配列を使用してコンストラクターを呼び出す直接的な方法はありません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();
$prototyping
MooTools がコンストラクターを呼び出さないためのスイッチです。