Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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;
    };
})()
Ответить с цитированием
  #2 (permalink)  
Старый 11.11.2009, 07:35
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от x-yuri
но поскольку в мсие они растут их com-объектов, этот способ как-бы отпадает
что-то не понял я эту мысль. Что там растет?
Ответить с цитированием
  #3 (permalink)  
Старый 11.11.2009, 09:28
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

А что тут комментировать? Вполне очевидное допиливание модели, по которой работает, в частности, Prototype.js.
Ответить с цитированием
  #4 (permalink)  
Старый 11.11.2009, 12:45
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Kolyaj
допиливание модели, по которой работает, в частности, Prototype.js
в Prototype.js такое допиливание может привести к ухудшению производительности.

upd: я тут подумал, в общем, все это вообще печально может кончиться.

Последний раз редактировалось Riim, 11.11.2009 в 12:49.
Ответить с цитированием
  #5 (permalink)  
Старый 11.11.2009, 14:00
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

$(…).method(function() {

    this.method ? // в IE здесь будет лежать ссылка на узел, без дополнительных методов обёртки,
                       // когда в других браузерах методы будут доступны, не хорошо получается.

});
Ответить с цитированием
  #6 (permalink)  
Старый 25.11.2009, 17:14
Интересующийся
Отправить личное сообщение для Denisko-Redisko Посмотреть профиль Найти все сообщения от Denisko-Redisko
 
Регистрация: 08.11.2009
Сообщений: 16

Riim,
Цитата:
что-то не понял я эту мысль. Что там растет?
Наверное выразился неточно. Вот это прояснит: http://forum.vingrad.ru/topic-193083.html

Octane, есть такое дело, надо просто иметь это ввиду.

Основное желание: ускорить работу в w3c браузерах, пусть и за счет небольшого падения производительности в msie.

Последний раз редактировалось Denisko-Redisko, 25.11.2009 в 19:06. Причина: Промахнулся :)
Ответить с цитированием
  #7 (permalink)  
Старый 25.11.2009, 17:30
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Denisko-Redisko
Kolyaj,
Промахнулся?
Ответить с цитированием
  #8 (permalink)  
Старый 25.11.2009, 17:52
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

Сообщение от Denisko-Redisko Посмотреть сообщение
Основное желание: ускорить работу в w3c браузерах, пусть и за счет небольшого падения производительности в msie.
Плохое желание. В ИЕ и так медленнее, а Вы еще хотите опустить.
Ответить с цитированием
  #9 (permalink)  
Старый 25.11.2009, 18:11
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от Denisko-Redisko
Octane, есть такое дело, надо просто иметь это ввиду.
У нас и так море различий, давайте еще плодить неоднозначности. Если в случае с такой оберткой:
{item: Element}

мы можем однозначно определить, в контексте какого объекта вызывается метод, проверив это в любом браузере, то в данном варианте нужно помнить о особенности браузера, а ведь одной из задач фреймворка является обеспечение кросс-браузерности, а значит в некоторой степени освобождение программиста от каких-то дополнительных проверок. Конечно, можно написать в документации, чтобы всегда юзали $(this) для получения кастомных методов, но это почти убивает идею получения прямой ссылки на элемент.

Сообщение от Denisko-Redisko
небольшого падения
Тестировали?
Ответить с цитированием
  #10 (permalink)  
Старый 25.11.2009, 19:20
Интересующийся
Отправить личное сообщение для Denisko-Redisko Посмотреть профиль Найти все сообщения от Denisko-Redisko
 
Регистрация: 08.11.2009
Сообщений: 16

Octane, как я понимаю, проблема (учитывать что this не содержит расширенных методов) будет только у автора фреймворка, ведь стоит задача не имитировать prototype в msie, а несколько ускорить работу/уменьшить потребление памяти в остальных браузерах.
Цитата:
Тестировали?
Нет, на глазок. Вызов одной лишней функи на один метод, не думаю что это много.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Prototype v1.4.0 and Prototype v1.5.1_rc3 prihod Prototype & script.aculo.us 2 02.10.2008 16:08
проблема с передачей русского текста в Prototype subaru Prototype & script.aculo.us 2 26.07.2007 16:56