Extends と Implements の主な違いは、Implement がクラスのプロトタイプを変更するのに対し、Extend はコピーを作成することです。つまり、変更をクラスに実装すると、そのクラスのすべてのインスタンスがその変更を即座に継承しますが、Extend を使用すると、既存のすべてのインスタンスは同じままになります。
これはモートリアルからの引用です。チェックしてください。http://mootorial.com/wiki/mootorial/02-class/#implement-vs.-extend
テストに関しては、忍者クラスでいくつかのサンプルケースを作成し、それらをhttp://www.jsfiddle.netに配置することを強くお勧めします。その後、分析に関するアドバイスや、Google または IRC の mootools メーリングリストを求めてください ( irc.freenode.net#mootools)、SO は mootools コア チームから多くのヒットを得ていないようです。理想的には、アーロン・ニュートン、アリアン、cpojer、rpflo のような人と話したいです :)
更新:私もこれについてブログに書きましたが、私は間違っていました。単純にミューテーターが likeExtends
と導入される順序に違いがありImplements
ます。実装と拡張はできますが、それを機能させるには、最初に Extends を宣言する必要があります。
詳細はこちら: http://fragged.org/mootools-pattern-fun-class-implements-extends-at-the-same-time_1359.html
update結局のところ、これが役立つ場合がいくつかあります。問題は次のとおりです。
var ninja = new Class({
kill: function() {
alert("kill!");
}
});
var human = new Class({
initialize: function(){
alert("i r human!");
}
});
var badass = new Class({
Implements: [ninja],
Extends: human,
initialize: function() {
alert("i r badass and.. ");
this.parent();
this.kill();
}
});
new badass(); // i r badass, i r human, this.kill is not a function exception.
...単に機能しません。代わりにninjaを実装するにはクラスhumanが必要で、単純にhumanを拡張するにはクラスbadassが必要です。人間が新しい kill メソッドを取得することによる副作用 (彼らが知っているかどうかはわかりません) は別として、これは、ワルが .kill を使用して直接の親である人間を呼び出すことができるようになることを意味します。
複雑なことをせずに、好きなように書き直してみませんか? Request.JSONP のようなネイティブ クラスを拡張してから、新しいストレージ クラスを拡張されたクラスにミックスインすることを決定する可能性があるためです。実話... いずれにせよ、利用可能な特定のクラスをリファクタリングする余裕はないかもしれません。
これを克服するための興味深いパターン (別の場所で定義されている request.jsonp というヒューマン クラスを考えてください) - 拡張しているクラスにメソッドとプロパティを追加したいだけで、mixin クラスを再利用する予定がない場合 (忍者):
human.implement(new new Class({
kill: function() {
alert("kill!");
}
}));
var badass = new Class({
Extends: human,
initialize: function() {
alert("i r badass and.. ");
this.parent();
this.kill();
}
});
new badass(); // // i r badass, i r human, kill!
おそらく、あなたはただできるかもしれませんhuman.implement({ method: function });
が、クラスはそれ以上のものになる可能性があります.
他の用途のために忍者クラスへの参照を保存したい場合、上記はこれと同じになります (ミックスインを再利用する場合):
var ninja new Class({
kill: function() {
alert("kill!");
}
});
human.implement(new ninja);
// this is what differs from say - instantiation + shared inherited properties.
// also, a constructor will work.
// the alternative would just do:
// human.prototype.kill = function() { alert("kill"); }
var badass = new Class({
Extends: human,
initialize: function() {
alert("i r badass and.. ");
this.parent();
this.kill();
}
});
new badass(); // // i r badass, i r human, kill!
これが誰かに役立つことを願っています。これは、ミックスインとして追加のストレージ クラスを使用して Request.JSONP を拡張している実際の例です: http://jsfiddle.net/dimitar/YacZe/