Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Паттерны и приемы! (https://javascript.ru/forum/misc/24396-patterny-i-priemy.html)

Livaanderiamarum 28.12.2011 14:57

Паттерны и приемы!
 
Общеизвестный прием запаковывания данных в скоп:

(function(){
  var cache = {};
  
  this.nya = function nya (str){
    cache = {}
  };
})();


создастся функция НЯ и в ней доступен cache , из вне он не доступен.

Какие приемы запаковывания, заворачивания вы еще знаете?) Какие еще прикольные приемы знаете, например как ускорить код и.т.п. Давайте обменяемся опытом)

melky 28.12.2011 15:29

прочитай книгу Javascript Patterns от Стояна Стефанова.

пара примеров кода "запаковки"

window.nya = new function(){
    var cache = {};
    this.getCache = function(){
        return cache;
    };
};


вот этот меня поразил, когда я его увидел в первый раз :
({
    css : function(el, prop){
        /*return css-prop*/
    },
    ajax : function(options){
        /*make ajax-request*/
    },
    init : function(name){
        var cache = {};
        this.getCache = function(){ return cache };

        delete this.init;
        window[name] = this;
    }
}).init("myToolbox");

myToolbox.ajax({ url : "foo", async : true }); //ajax-req.
myToolBox.css(document.body, "width"); // some width
myToolbox.getCache(); // {}
typeof myToolbox.cache // undefined.
typeof myToolbox.init // undefined.

Livaanderiamarum 28.12.2011 15:34

window.nya = new function(){
    var cache = {};
    this.getCache = function(){
        return cache;
    };
};


вот тут не понял, чем отличается cache от getCache ? какая разница чем GO засирать? можешь наглядный пример кинуть с этим?

melky 28.12.2011 15:49

window.nya = new function(){
    var cache = {};
    this.getCache = function(){
        return cache;
    };
};

alert([ typeof nya.getCache(), typeof nya.cache, typeof cache ]); // obj, undef, undef.

Livaanderiamarum 28.12.2011 15:54

Цитата:

Сообщение от melky (Сообщение 146835)
window.nya = new function(){
    var cache = {};
    this.getCache = function(){
        return cache;
    };
};

alert([ typeof nya.getCache(), typeof nya.cache, typeof cache ]); // obj, undef, undef.

ээм. так я всегда так делаю))) ну обьвляю в конструкторе переменные, потом обращаюсь к ним из методов обьекта который конструирую)))
крута значит я все правильно делаю))

GuardCat 28.12.2011 15:54

Цитата:

Сообщение от melky
вот этот меня поразил, когда я его увидел в первый раз :

Это интересно! Практический эффект тот же, что и от первого варианта, но интереснее.

melky 28.12.2011 15:57

Цитата:

Сообщение от GuardCat (Сообщение 146838)
Это интересно! Практический эффект тот же, что и от первого варианта, но интереснее.

и код понятнее, если кол-во функций типа ajax и css увеличить.

единственная загвоздка - в методе init :)

GuardCat 28.12.2011 15:59

Цитата:

Сообщение от melky
и код понятнее, если кол-во функций типа ajax и css увеличить.

Да, тоже об этом подумал.
Цитата:

Сообщение от melky
единственная загвоздка - в методе init

А в чём загвоздка? Свойство-камикадзе не есть хорошо?

Livaanderiamarum 28.12.2011 16:01

Цитата:

Сообщение от GuardCat (Сообщение 146840)
А в чём загвоздка? Свойство-камикадзе не есть хорошо?

Вообще-то, это ЕСТЬ хорошо)! нахрена нам инициализировать объект несколько раз? наоборот, инициализировали - убрали инициализатор чтобы не засорял

B@rmaley.e><e 28.12.2011 16:16

Цитата:

Сообщение от GuardCat
Свойство-камикадзе не есть хорошо?

+1
Зачем создавать метод, который будет вызван всего один раз (а потом ещё и самоликвидируется)? Лучше сразу сделать анонимную функцию, которая будет собирать и возвращать объект.


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