11.11.2009, 05:24
|
|
|
|
Регистрация: 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;
};
})()
|
|
11.11.2009, 07:35
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от x-yuri
|
но поскольку в мсие они растут их com-объектов, этот способ как-бы отпадает
|
что-то не понял я эту мысль. Что там растет?
|
|
11.11.2009, 09:28
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
А что тут комментировать? Вполне очевидное допиливание модели, по которой работает, в частности, Prototype.js.
|
|
11.11.2009, 12:45
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от Kolyaj
|
допиливание модели, по которой работает, в частности, Prototype.js
|
в Prototype.js такое допиливание может привести к ухудшению производительности.
upd: я тут подумал, в общем, все это вообще печально может кончиться.
Последний раз редактировалось Riim, 11.11.2009 в 12:49.
|
|
11.11.2009, 14:00
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
$(…).method(function() {
this.method ? // в IE здесь будет лежать ссылка на узел, без дополнительных методов обёртки,
// когда в других браузерах методы будут доступны, не хорошо получается.
});
|
|
25.11.2009, 17:14
|
Интересующийся
|
|
Регистрация: 08.11.2009
Сообщений: 16
|
|
Riim,
Цитата:
|
что-то не понял я эту мысль. Что там растет?
|
Наверное выразился неточно. Вот это прояснит: http://forum.vingrad.ru/topic-193083.html
Octane, есть такое дело, надо просто иметь это ввиду.
Основное желание: ускорить работу в w3c браузерах, пусть и за счет небольшого падения производительности в msie.
Последний раз редактировалось Denisko-Redisko, 25.11.2009 в 19:06.
Причина: Промахнулся :)
|
|
25.11.2009, 17:30
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от Denisko-Redisko
|
Kolyaj,
|
Промахнулся?
|
|
25.11.2009, 17:52
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
Сообщение от Denisko-Redisko
|
Основное желание: ускорить работу в w3c браузерах, пусть и за счет небольшого падения производительности в msie.
|
Плохое желание. В ИЕ и так медленнее, а Вы еще хотите опустить.
|
|
25.11.2009, 18:11
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Сообщение от Denisko-Redisko
|
Octane, есть такое дело, надо просто иметь это ввиду.
|
У нас и так море различий, давайте еще плодить неоднозначности. Если в случае с такой оберткой:
{item: Element}
мы можем однозначно определить, в контексте какого объекта вызывается метод, проверив это в любом браузере, то в данном варианте нужно помнить о особенности браузера, а ведь одной из задач фреймворка является обеспечение кросс-браузерности, а значит в некоторой степени освобождение программиста от каких-то дополнительных проверок. Конечно, можно написать в документации, чтобы всегда юзали $(this) для получения кастомных методов, но это почти убивает идею получения прямой ссылки на элемент.
Сообщение от Denisko-Redisko
|
небольшого падения
|
Тестировали?
|
|
25.11.2009, 19:20
|
Интересующийся
|
|
Регистрация: 08.11.2009
Сообщений: 16
|
|
Octane, как я понимаю, проблема (учитывать что this не содержит расширенных методов) будет только у автора фреймворка, ведь стоит задача не имитировать prototype в msie, а несколько ускорить работу/уменьшить потребление памяти в остальных браузерах.
Нет, на глазок. Вызов одной лишней функи на один метод, не думаю что это много.
|
|
|
|