Паттерны и приемы!
Общеизвестный прием запаковывания данных в скоп:
(function(){
var cache = {};
this.nya = function nya (str){
cache = {}
};
})();
создастся функция НЯ и в ней доступен cache , из вне он не доступен. Какие приемы запаковывания, заворачивания вы еще знаете?) Какие еще прикольные приемы знаете, например как ускорить код и.т.п. Давайте обменяемся опытом) |
прочитай книгу 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.
|
window.nya = new function(){
var cache = {};
this.getCache = function(){
return cache;
};
};
вот тут не понял, чем отличается cache от getCache ? какая разница чем GO засирать? можешь наглядный пример кинуть с этим? |
window.nya = new function(){
var cache = {};
this.getCache = function(){
return cache;
};
};
alert([ typeof nya.getCache(), typeof nya.cache, typeof cache ]); // obj, undef, undef.
|
Цитата:
крута значит я все правильно делаю)) |
Цитата:
|
Цитата:
единственная загвоздка - в методе init :) |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Зачем создавать метод, который будет вызван всего один раз (а потом ещё и самоликвидируется)? Лучше сразу сделать анонимную функцию, которая будет собирать и возвращать объект. |
Цитата:
|
myToolbox = (function () {
var o = {
css: function (el, prop) { /*return css-prop*/
},
ajax: function (options) { /*make ajax-request*/
}
};
var cache = {};
o.getCache = function () {
return cache
};
return o;
})();
myToolbox.ajax({
url: "foo",
async: true
}); //ajax-req.
myToolBox.css(document.body, "width"); // some width
myToolbox.getCache(); // {}
typeof myToolbox.cache // undefined.
|
А «o» несёт какую-нибудь смысловую нагрузку? Или можно делать так:
myToolbox = (
function () {
var cache = {};
return {
css: function (el, prop) {
/*return css-prop*/
},
ajax: function (options) {
/*make ajax-request*/
},
getCache: function () {
return cache
}
};
}
)();
? Мне так читать проще. |
B@rmaley.e><e так код труднее читать (минимум, только мне). когда функции приведены похожим списком, они как-то легче усваиваются. плюс, неужели так тяжела инициализация и удаление свойства у объекта?
минусом объекта с инициализатором является, конечно, плохая его усваиваемость, если программист не понимает, с чем имеет дело. потом идёт все как по маслу. и ещё один минусом будет использование одной "приватной" переменной несколькими функциями. для этого инициализирующийся объект не предназначен, а вот анонимная исполняющаяся функция - как раз для этого подходит! GuardCat, приведённая вами одноразовая фабрика объектов - золотая середина между самоисполняющейся функцией и самоинициализирующемся объектом. ) |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Цитата:
var a = ({
// сотни тысяч строк кода
Чем, Вы подумаете, будет a? Особенно если Вы программируете на JS пару месяцев и ещё не прочитали JavaScript Patterns Стефанова? Если (function () стало более-менее стандартным синтаксисом (и то постоянно появляются вопросы в духе "Что значит (function () {})") для самовызвающихся функций, то ({ … }) не столь сильно распространено (Хотелось бы увидеть примеры его использования в каких-нибудь приличных библиотеках или JS приложениях).Далее: IDE. Если среда и догадается каким-нибудь образом о структуре создаваемого объекта (очевидно не в исходном случае, т.к. там понять, куда будет записан объект, без анализа графа потока управления вряд ли получится). А уж догадаться о том, что метод в любом случае будет удалён и, как результат, его не нужно подставлять в какой-нибудь автокомплит, ещё труднее. Цитата:
|
Цитата:
Цитата:
Цитата:
НО! активность использования каких-либо шаблонов проектирования не говорит о том, что "этот шаблон хороший, а этот плохой". все они реализуют одно и то же. Единственное, выбор человек делает в пользу вкуса. и поставленной задачи. Цитата:
a = {
test : "nice",
magic : function(){
return this.te*!*<CTRL+SPACE>*/!*
}
};
PS Komodo Edit, как помню, всё отлично понимал. это было год назад. |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
![]() Печально, но ни Eclipse JSDT, ни Netbeans не распознали ни одну из конструкций
var a = (function () {return obj})()
var a = ({ get : function () { return this } }).get()
UPD: Впрочем, в Эклипсе это исправимо. |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Постепенно запомнишь главное, ну а если уж понадобится что-то тонкое - словарь к твоим услугам) |
Цитата:
чем это плохо ? PS комод не справился. |
Цитата:
Цитата:
|
Цитата:
если хочешь чтобы он был доступен в window.utils.jQuery, ты не поверишь, но делай так: window.utils.jQuery = $ |
B@rmaley.e><e. иногда пишут в аргументах самоисполняющейся функции объект экспорта (т.е. куда будет экспортирована переменная)
но в случае jQuery переменная экспортируется в шорткат window. сделано, видать, чтобы два раза window в аргументах не писать.
(function(window, varName, exportObj){
window.getComputedStyle...
exportObj[varName] = jquery.
})(window/*shortcut*/, "jQuery"/*var-e name*/, window /*export obj*/);
Цитата:
|
Цитата:
|
Цитата:
_____________ и запомните люди, костыль, это когда пациент хромает. |
Цитата:
|
| Часовой пояс GMT +3, время: 20:11. |