Mootools “Расширяется” плюс “Реализации”

Проверьте Мягкий плагин:

http://www.vim.org/scripts/script.php?script_id=2219

10
задан 12 November 2009 в 12:23
поделиться

3 ответа

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! Роман

1
ответ дан 3 December 2019 в 23:50
поделиться

Основное различие между 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 :)


update: Я даже писал об этом в блоге, но я был неправ. Просто существует разница в порядке, в котором вводятся мутаторы, такие как 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/

12
ответ дан 3 December 2019 в 23:50
поделиться

Расширения и Реализации очень хорошо протестированы самими разработчиками Mootools. Фактически весь набор тестов, который они используют, доступен на anutron / mootools-unittester . Вам не нужно тестировать основную функциональность фреймворка, это сделано за вас (и сделано очень хорошо).

Я бы посоветовал хорошо прочитать, что делают Extend и Implement в документации mootools, clientcide сайт, мототехника и др.

Сколько объектов вы создаете кстати? Если это не огромное количество, то память и т. Д. Не должна быть серьезной проблемой, даже если она создавала объекты с большим объемом памяти. Может быть, это преждевременная оптимизация?

0
ответ дан 3 December 2019 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: