Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   каменное кеширование? (https://javascript.ru/forum/misc/16974-kamennoe-keshirovanie.html)

melky 01.05.2011 10:43

каменное кеширование?
 
возник вопрос, почему почти везде делают так :

function xlmObj(){
                                
    try  { 
                              
        return new XMLHttpRequest();
                               
    } catch (m){
                                  
        try {
                              
            return new ActiveXObject("Msxml2.XMLHTTP");
                           
        } catch (e) {
                          
            try {
                         
                return new ActiveXObject("Microsoft.XMLHTTP");
                           
                } catch (E) {
                              
                    return ;
                                  
                            }
                    }
                }
}


если можно сделать по-другому, не вычисляя каждый раз ЭТО :


(function(window){
 
  if( !window.XMLHttpRequest ){
    

          window.XMLHttpRequest =  (function(){    
             try {   
                      return new ActiveXObject("Msxml2.XMLHTTP");
                 } 
            catch ( e ) {
                
                try {
                    
                       return new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    
                catch ( g ) { return new IFRAME_imitation(); }
                    
                        }       

    })()// func end.
          

  }

})(window)



а потом уже использовать XMLHttpRequest,как обычно. во всех браузерах

var a = XMLHttpRequest( ) ;

a.open('GET',url);

........



если это ифрейм-имитация, то во фрейме будет при open создаваться форма, при send отправляться. ну , это уже можно додумать.


и еще один вопрос.

в jQuery , можно посмотреть тут,например

по поиску // Fake xhr, в функции ajax, есть фейковый объект XMLHttpRequest

и метод аборт у него :

// Cancel the request
				abort: function( statusText ) {
					statusText = statusText || "abort";
					if ( transport ) {
						transport.abort( statusText );
					}
					done( 0, statusText );
					return this;
				}



обьясните пожалуйста,зачем создавать этот фейковый объект XMLHttpRequest.

subzey 02.05.2011 14:01

1. Дело вкуса. По сути, написано одно и то же.
2. jQuery спроектирован так, что он никогда не должен выдавать ошибок. Поэтому если браузер ну вообще никак не поддерживает аякс, для того, чтобы не менять логику, сделаем так, что он «типа» его поддерживает.

То есть, мы можем сделать так:
var myObj;
if (myObj = document.getElementById("my-object")){
	myObj.style.color = "red";
};

И присваивание произойдет только если элемент найден.

Или так:
(document.getElementById("my-object") || {"style": {}}).style.color = "red"

И присваивание произойдет в любом случае, но если объекта нет, значение присвоится и сразу же уйдет в небытие сборщику мусора.

Второй способ внешне похож на говнокод, но в случае, когда отсутствие объекта с id "my-object" — явление, скорее, аварийное, чем штатное, вполне себя оправдывает.

Riim 02.05.2011 15:15

Цитата:

Сообщение от melky
почему почти везде делают так

из-за невозможности использовать свойство prototype получаемого конструктора (точнее его использование становится бесполезным). Это неправильно с точки зрения ООП. По этой причине в ранних версиях PrototypeJs вместо "new Element" было "Element.create" и вместо "new Class" было "Class.create" (там еще есть примеры, например, тот же XMLHttpRequest по-прежнему добывается через "Ajax.getTransport"). Позже в MooTools это решили добавлением специальных методов, которые как бы создают видимость, что все нормально (по факту вручную дописывают методы созданному экземпляру). Еще позже PrototypeJs догнал по элементам и теперь можно писать "new Element", у создаваемых классов тоже появились нужные методы (точнее один: Class#addMethods), но видимо для совместимости оставили вызов через "Class.create" (или может чего еще не хватило для правильного ООП).

Kolyaj 02.05.2011 15:55

Riim,
я что-то не понял ничего из того, что вы написали. Я уже давно везде использую подход, похожий на предложение melky и никаких проблем не наблюдаю.

UPD: хотя примерно понял, но кажется вы всё смешали в кучу.

Riim 02.05.2011 15:59

Цитата:

Сообщение от Kolyaj
никаких проблем не наблюдаю

так я же и не пугаю проблемами, используйте дальше, все нормально :) .

melky 02.05.2011 19:22

Цитата:

Сообщение от Riim (Сообщение 102986)
из-за невозможности использовать свойство prototype получаемого конструктора (точнее его использование становится бесполезным).

Это неправильно с точки зрения ООП. По этой причине в ранних версиях PrototypeJs вместо "new Element" было "Element.create" и вместо "new Class" было "Class.create" (там еще есть примеры, например, тот же XMLHttpRequest по-прежнему добывается через "Ajax.getTransport").


я немножко не понял,о чем вы написали.

вы ведь о примере из jQuery объяснили?

но там ведь и не пахнет прототипами. там ведь использование методов-заглушек при отсутствии оных в объекте

...

спасибо Kolyaj за ссылку на свой фреймворк (да?). forEach, map , every , перемешка и т.д я нахожу юзабельными )

у меня тоже есть гит, но он у меня только для сохранение истории изменения кода :)

Kolyaj 02.05.2011 19:46

Цитата:

Сообщение от melky
свой фреймворк (да?)

Я бы не стал называть это фреймворком. Так, библиотечка.

melky 02.05.2011 19:48

Цитата:

Сообщение от Kolyaj (Сообщение 103048)
Я бы не стал называть это фреймворком. Так, библиотечка.

свой домашний prototype.js :)

Riim 03.05.2011 02:02

Вроде так понятно написал, но никто не понимает :( . В общем, на примере:

if (!window.XMLHttpRequest) {
	function XMLHttpRequest() {
		try {return new ActiveXObject('Msxml2.XMLHTTP')} catch (err) {}
		try {return new ActiveXObject('Microsoft.XMLHTTP')} catch (err) {}
		return null;
	}
}

XMLHttpRequest.prototype.myMethod = function() {
	alert('Ok!');
};

var xhr = new XMLHttpRequest();

xhr.myMethod();


Здесь alert не сработает в IE, т. к. в IE конструктор возвращает не свой this.


Часовой пояс GMT +3, время: 13:30.