28.12.2011, 16:18
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Сообщение от B@rmaley.e><e
|
+1
Зачем создавать метод, который будет вызван всего один раз (а потом ещё и самоликвидируется)? Лучше сразу сделать анонимную функцию, которая будет собирать и возвращать объект.
|
покажи твою версию реализации этого примера
|
|
28.12.2011, 16:26
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
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.
|
|
28.12.2011, 17:26
|
|
Просто любитель
|
|
Регистрация: 13.09.2011
Сообщений: 300
|
|
А «o» несёт какую-нибудь смысловую нагрузку? Или можно делать так:
myToolbox = (
function () {
var cache = {};
return {
css: function (el, prop) {
/*return css-prop*/
},
ajax: function (options) {
/*make ajax-request*/
},
getCache: function () {
return cache
}
};
}
)();
?
Мне так читать проще.
|
|
28.12.2011, 17:41
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
B@rmaley.e><e так код труднее читать (минимум, только мне). когда функции приведены похожим списком, они как-то легче усваиваются. плюс, неужели так тяжела инициализация и удаление свойства у объекта?
минусом объекта с инициализатором является, конечно, плохая его усваиваемость, если программист не понимает, с чем имеет дело. потом идёт все как по маслу.
и ещё один минусом будет использование одной "приватной" переменной несколькими функциями. для этого инициализирующийся объект не предназначен, а вот анонимная исполняющаяся функция - как раз для этого подходит!
GuardCat, приведённая вами одноразовая фабрика объектов - золотая середина между самоисполняющейся функцией и самоинициализирующемся объектом. )
Последний раз редактировалось melky, 28.12.2011 в 17:43.
|
|
28.12.2011, 17:46
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Сообщение от melky
|
так код труднее читать (минимум, только мне). когда функции приведены похожим списком, они как-то легче усваиваются. плюс, неужели так тяжела инициализация и удаление свойства у объекта?
|
+1
|
|
28.12.2011, 18:00
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Сообщение от melky
|
пиши в одно сообщение.
это то же самое, что и вариант GuardCat.
|
удали свое сообщение я удалил вопрос "чем код лучше"
|
|
28.12.2011, 19:18
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Сообщение от Livaanderiamarum
|
чем твой код лучше?
|
Тем, что там нет самоудаляющейся функции и используется более привычная большинству концепция самовызывающихся функций.
Сообщение от GuardCat
|
А «o» несёт какую-нибудь смысловую нагрузку?
|
В моём примере — нет. Оно написано так только для сохранения исходного стиля.
Сообщение от melky
|
B@rmaley.e><e так код труднее читать (минимум, только мне).
|
А увидев код вроде
var a = ({
// сотни тысяч строк кода
Чем, Вы подумаете, будет a? Особенно если Вы программируете на JS пару месяцев и ещё не прочитали JavaScript Patterns Стефанова? Если (function () стало более-менее стандартным синтаксисом (и то постоянно появляются вопросы в духе "Что значит (function () {})") для самовызвающихся функций, то ({ … }) не столь сильно распространено (Хотелось бы увидеть примеры его использования в каких-нибудь приличных библиотеках или JS приложениях).
Далее: IDE. Если среда и догадается каким-нибудь образом о структуре создаваемого объекта (очевидно не в исходном случае, т.к. там понять, куда будет записан объект, без анализа графа потока управления вряд ли получится). А уж догадаться о том, что метод в любом случае будет удалён и, как результат, его не нужно подставлять в какой-нибудь автокомплит, ещё труднее.
Сообщение от melky
|
неужели так тяжела инициализация и удаление свойства у объекта?
|
Проблема не в их легкости / тяжёлости, а в том, что непонятно, зачем их объявлять вместе с объектом, если они не будут частью него. Если бы этот метод назывался clone и делал то, что должен делать исходя из названия, вопросов бы не было. Получился бы такой объект-прототип, копию которого всегда можно получить.
|
|
28.12.2011, 19:40
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от B@rmaley.e><e
|
А увидев код вроде
var a = ({
// сотни тысяч строк кода
Чем, Вы подумаете, будет a?
|
ваш пример некорректен. инициализирующая функция не возвращает результат. она только удаляет себя и инкапсулирует создаёт переменную в глобальной области.
Сообщение от B@rmaley.e><e
|
Особенно если Вы программируете на JS пару месяцев и ещё не прочитали JavaScript Patterns Стефанова?
|
с этим проблема, да. но это я уже расписал в своём сообщении выше.
Сообщение от B@rmaley.e><e
|
(Хотелось бы увидеть примеры его использования в каких-нибудь приличных библиотеках или JS приложениях).
|
oops... с этим проблема.
НО! активность использования каких-либо шаблонов проектирования не говорит о том, что "этот шаблон хороший, а этот плохой". все они реализуют одно и то же. Единственное, выбор человек делает в пользу вкуса. и поставленной задачи.
Сообщение от B@rmaley.e><e
|
Далее: IDE. Если среда и догадается каким-нибудь образом о структуре создаваемого объекта (очевидно не в исходном случае, т.к. там понять, куда будет записан объект, без анализа графа потока управления вряд ли получится).
|
хм. т.е. вы хотите сказать, что IDE не поймёт кода и не подставит заверщение имени переменной в этом случае ?
a = {
test : "nice",
magic : function(){
return this.te*!*<CTRL+SPACE>*/!*
}
};
PS Komodo Edit, как помню, всё отлично понимал. это было год назад.
|
|
28.12.2011, 19:56
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Сообщение от melky
|
она только удаляет себя и инкапсулирует создаёт переменную в глобальной области.
|
Этот подход тем более плох. Не надо решать за пользователя, куда записывать объект.
Сообщение от melky
|
вы хотите сказать, что IDE не поймёт кода и не подставит заверщение имени переменной в этом случае ?
|
Да. Возьмите свой исходный код, добавьте его в проект, а в соседнем файле наберите myToolbox.<Ctrl+Space>. Я буду сильно удивлён, если это сработает (и ещё больше, если при этом init'а не будет).
|
|
29.12.2011, 00:38
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Сообщение от B@rmaley.e><e
|
Этот подход тем более плох. Не надо решать за пользователя, куда записывать объект.Да. Возьмите свой исходный код, добавьте его в проект, а в соседнем файле наберите myToolbox.<Ctrl+Space>. Я буду сильно удивлён, если это сработает (и ещё больше, если при этом init'а не будет).
|
вижуал студио справился) нетбенс 701 справился
|
|
|
|