Паттерны и приемы!
Общеизвестный прием запаковывания данных в скоп:
(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, время: 13:22. |