Показать сообщение отдельно
  #1 (permalink)  
Старый 11.11.2009, 05:24
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Оптимизация долларовой либы за счет prototype
на самом деле это кросспост из vingrad'а, причем не я автор, но может кто-то захочет прокомментировать:

Один из минусов любой долларовой библиотеки -- это создание лишнего объекта на каждый юзаемый в коде нод. В браузерах поддерживающих prototype для Node мы могли бы просто расширить поведение html-элементов, но поскольку в мсие они растут их com-объектов, этот способ как-бы отпадает. Старая идея имитировать prototype через behavior: url(HTMLElement.htc) страдает непреодолимым недостатком -- чрезвычайно медленной работой на большом DOM.
Способ, который хочу обсудить, имеет целью убрать создание лишнего объекта за счет расширения prototype в w3c браузерах, (но создания еще одной лишней функции-обертки в мсие). Собственно сама идея:

(function () {

    var doc = document,
        css = doc.styleSheets,
        win = window,
        etc;

    var BucksObject = function (node) {
        // унифицированное свойство node для доступа к ноду
        this.node = node.constructor === String ? doc.getElementById(node) : node;
    },

    bucksPrototype = {
        method : code,
        etc
    };
    if(window.Node && Node.prototype) {

        // расширение Node для стандартных браузеров

        window.$ = function (node) {
            if( node.constructor === String ) {
                node = doc.getElementById(node)
            };
            // унифицированное свойство node для доступа к ноду
            node.node = node;
            return node;
        };

        expand(Node.prototype, bucksPrototype); // копирует только отсутствующие свойства

    } else {

        // создание объекта-обертки для браузеров без Node.prototype

        window.$ = function (argument) {
            return argument instanceof BucksObject ?
                argument :
                new BucksObject(argument)
        };

        // создать обертки для всех методов
        for (var name in bucksPrototype) {
            bucksPrototype[name] = (function(method){ return function () {
                return method.apply(this.node, arguments)
            }})(bucksPrototype[name]);
        };

        BucksObject.prototype = bucksPrototype;
    };
})()
Ответить с цитированием