I finally got my answer on the Mootools google group, thought I would update it here in case some one finds interest in it.
http://groups.google.com/group/mootools-users/browse_thread/thread/5aec78813fa51cc1
Enjoy! Роман
Основное различие между Extends и Implements состоит в том, что Implement изменяет прототип класса, а Extend создает копию. Это означает, что если вы реализуете изменение в классе, все экземпляры этого класса унаследуют это изменение мгновенно, а если вы используете Extend, все существующие экземпляры останутся такими же.
это цитата из моторолика, посмотрите. http://mootorial.com/wiki/mootorial/02-class/#implement-vs.-extend
Что касается тестирования - я бы очень рекомендовал вам создать несколько примеров кейсов с классами ниндзя и поместить их на http://www.jsfiddle.net - затем спросите аналитический совет или список рассылки mootools в Google или IRC (irc.freenode.net # mootools), SO, похоже, не получает много хитов от основной команды mootools. Идеально, вы хотите поговорить с кем-нибудь вроде Аарона Ньютона, Ариана, cpojer или rpflo :)
Extends
и 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.
... просто не работает. Вам нужен класс human для реализации ninja вместо этого и класс badass , чтобы просто расширить human . Помимо побочного эффекта, когда люди получают новый метод уничтожения (о котором они могут знать или не знать), это будет означать, что задира сможет использовать .kill, а также призывать своего прямого родителя человека.
Почему? не переписывать вещи так, как вы хотите, и без осложнений? Потому что вы можете расширять собственный класс, например Request.JSONP, а затем решить смешать новый класс хранилища с вашим расширенным. Реальная история ... В любом случае, у вас может не быть роскоши рефакторинга определенных классов, доступных вам.
Интересный паттерн для преодоления этого (рассмотрите человеческий класс your 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/
Расширения и Реализации очень хорошо протестированы самими разработчиками Mootools. Фактически весь набор тестов, который они используют, доступен на anutron / mootools-unittester . Вам не нужно тестировать основную функциональность фреймворка, это сделано за вас (и сделано очень хорошо).
Я бы посоветовал хорошо прочитать, что делают Extend и Implement в документации mootools, clientcide сайт, мототехника и др.
Сколько объектов вы создаете кстати? Если это не огромное количество, то память и т. Д. Не должна быть серьезной проблемой, даже если она создавала объекты с большим объемом памяти. Может быть, это преждевременная оптимизация?