| 
	| 
	
	| 
		
	| 
			
			 
			
				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, а несколько ускорить работу/уменьшить потребление памяти в остальных браузерах. Нет, на глазок. Вызов одной лишней функи на один метод, не думаю что это много. |  |  |  |