Как стать автором
Обновить

Комментарии 42

аналогично, пользуюсь таким же методом.
Иа, иа, иа того же мнения. (с) Винни-Пух
Тем кто хочет лучше разобраться в яваскрипте могу посоветовать разобраться в каком нибудь фрэймворке самостоятельно, в том же jQuery например. Если вы это осилите, то будете знать абсолютное большинство яваскриптовых фишечек и наворотов.
Я же могу посоветовать тем, кто действительно хочет разобраться в JS трогать jQuery в самом конце.
А я подумал что ресь пойдет про Javascript-2. Путающее название :)
Ага, Javascript++
Вместо иронии сходите сюда. Пока неясно - что из этого выйдет, но про JavaScript 2 говорят хотя более принято название ECMAscript 4 и там-таки есть пространства имён, так что прочитать название так, как это сделал homm сам бог велел...
Я обращаюсь к хабрособществу с просьбой!
Помогите, плз!
Моя кошка вчера родила! У одного из котят вывернута лапа (обнаружил только что!)
В ветклинику везти поздно (половина третьего ночи).
Что можно сделать?! Гугл ответа не дал!
ПлАчу вместе с женой - жалко и кошку, и котенка!
Помогите, плз!
Мда, к месту конечно. Вправьте как полагается, это ж котенок, там и костей-то у них после рождения еще толком нет, больно ему не будет.
Огромное человеческое спасибо за отклик!
Просто в три часа ночи уже не знал в какую сторону кричать караул! :)
var NewObject = {};
(function() {
var privateStr = 'Я приватная';
NewObject = {
methodX: function() {
alert(privateStr);
}
}
})
NewObject.methodX();
var NewObject = {};
(function() {
var privateStr = 'Я приватная';
NewObject = {
methodX: function() {
alert(privateStr);
}
}
})
NewObject.methodX();
var NewObject = {};
(function() {
var privateStr = 'Я приватная';
NewObject = {
methodX: function() {
alert(privateStr);
}
}
})
NewObject.methodX();
var NewObject = {};
(function() {
var privateStr = 'Я приватная';
NewObject = {
methodX: function() {
alert(privateStr);
}
}
})
NewObject.methodX();
Не понял, что как много раз написалось? Можно как-то удалить лишнее? =\
Не... либо

var NewObject;
(function() {
var privateStr = 'Я приватная';
NewObject = {
methodX: function() {
alert(privateStr);
}
}
})

либо

var NewObject = {};
(function() {
var privateStr = 'Я приватная';
NewObject.methodX = function() {
alert(privateStr);
}
})

.
А по JS вроде отдельный блог есть.
Да, вы правы. В качестве извинения могу лишь сказать, что ошибся из-за того, что первоначальный пост, на который я ссылаюсь, был опубликован именно здесь.
Блин, как дети: первое - это упрощенное описание класса, второе - это массив.

Есть проект показательный FCKEditor - так вот на нем можно учить джавасрипт. Там и классы с вложенностью и все наворот реально юзаются. А это примитв какой-то, имхо.
Всё хорошо, кроме способа публикации публичных функций и методов.

Их лучше экспортировать как члены пространства имён, иначе замусориваем глобальное пространство имён, что неудобно для отладки и замедляет само приложение, не говоря уж о проблемах с совместным использованием разных библиотек.
читать *публичных функций и переменных.
Ну пойми, а ему может быть так удобнее, тут наверно дело привычки )
Не могли бы вы пояснить свою мысль? Вы по поводу первого примера или второго? В каком из них происходит засорение глобального пространства имён? В первом примере публичные функции и методы могут быть вызваны только через имя App, в глобальное пространство имён только оно вводится, таким образом.
// public function
function foo()
{
// use private data
alert(_FooMember);

// call private function
_foo();
}

я бы описывал так:

// public function
var foo = function()
{
// use private data
alert(_FooMember);

// call private function
_foo();
}
Я, кстати, сегодня утром специально проверил объявление через обычное
function f()
{
}

Меня удвило, что это корректно отрабатывалось именно в области видимости пространства имён, а не в глобальном. хотя всё равно я предпочитаю явно определять через var :)

P.S.: проверял в FF3RC1, IE8b1. Других браузеров под рукой не было :)
есть метод проще

App = function()
{
// private members
var _foo = ...
var _fooBar = function() { ... } ..

// public members
this.bar = ...
this.barFoo = function() { ... }
}

(ЗЫ тег Code дублирует код 4 раза, что за ерунда)
Тогда уж:
var App = new (function() {...})();
Вы комментируете фрагмент кода, в котором создается конструктор, который, в свою очередь, может "породить" множество объектов. У Вас - лишь создание одного единственного и неповторимого объекта.
Ну, пространство имён это и есть неповторимый объект :)
В случае же множества объектов, по идее, локальные переменные конструктора становятся не "приватными" свойствами объекта, а приватными статическими свойствами "класса".
>…пространство имён это и есть неповторимый объект :)

Дайте ссылочку почитать о том, что namespace – это объект. ;)


>…локальные переменные конструктора становятся не "приватными" свойствами объекта, а приватными статическими свойствами "класса".

Нет, во-первых, все же локальные переменные конструктора – это private instance members (если уж дошло до class-based терминологии). Во-вторых, в ES3-программе можно создать приватные статические св-ва чего-угодно (конструктора, прототипа, экземпляра), но только не класса, потому что классов в ES3 не существует.

А вообще, изначально хотел просто заметить, что создаете совершенно отличные друг от друга структуры, предназначающиеся для разных целей.
>Дайте ссылочку почитать о том, что namespace – это объект. ;)
В статье и данной дискуссии абстрактное понятие пространства имён реализуется (может кто-то скажет - эмулируется) в JS путём сбора функций, переменных и т.п. вместе в виде свойств одного объекта :)

>все же локальные переменные конструктора – это private instance members
Да, тут меня торкнуло что-то.

>классов в ES3 не существует.
Я специально "класса" взял в кавычки.
>Я специально "класса" взял в кавычки.

Я тоже специально обратил на это внимание. ;)
Везде конструкторы - это конструкторы, а в ES3 с чего-то вдруг они стали классами в кавычках. ;)
Я имел ввиду, что все объекты, созданные одним конструктором будут разделять одну локальную переменную из контекста конструктора, т.е. это будет аналог статической переменной из class-based ООП.
Правда, как уже признался, в этом предположении я наврал. Сейчас тоже с этим работаю и напутал понятия с перегрева :)
Да с переменными-то разобрались. Я уже о том, что js'овская функция-конструктор не может (ну ни-и-и как) называться классом (хоть как это слово закавычивать)...
Кстати, почти на эту тему (классы и т.п.) сегодня, отвечая одному из своих собеседников, цитировал Big Gungs of JS - прочтите, если есть время.
Да, я прочитал это еще до того, как Вы дали ссылку.
Много нового не узнал. Не в последнюю очередь благодаря тому, что читал другие Ваши комментарии :)
В ES3 нет классов, но если кому-то (не мне) действительно нравится переносить классовую терминологию на JS, то к чему еще привешивать ярлык "класса", как ни к конструктору?

PS. Кстати, выше я конструктор с классом нигде не сравнивал :)
>к чему еще привешивать ярлык "класса", как ни к конструктору

С большущей натяжкой можно было бы "прилепить" это ярлык к связке конструктор и прототип. Однако все-равно будет не верно. Представьте, что можно "творить" с конструкторами и прототипами в run-time в J(ava)Script и возможно ли такое, применительно к классам (ну хотя бы в самом страшном сне "classical"-программиста).

>Кстати, выше я конструктор с классом нигде не сравнивал :)

Как хитро! :) Сами же пишите: "к чему еще привешивать ярлык "класса", как ни к конструктору"...
>Как хитро! :) Сами же пишите: "к чему еще привешивать ярлык "класса", как ни к конструктору"...
Это не выше, это уже после Ваших реплик :)
Можно так, но это не очень хороший вариант. Он создает синглтон, а чаще надо объявить класс (мой код выше), после чего можно создавать инстансы как
var myApp1 = new App();
var myApp2 = new App();
Так здесь же не о классах, а о NS.
можно еще проще
Еще проще.
window.App = new function(){
...
};
так можно присваивать внутри функции, чтоб глобально видать было, в том числе анонимных - не пачкающих глобальное пространство имен
Что, простите?
оффтоп:
и pre тоже 4 раза копирует, если они идут последними в посте
Да, очень похоже.
Просто и со вкусом.
в стенах нашей лаборатории ученые нашли метод избавления от App

App.FooMember = App.foo = 0;

может кому пригодится ? :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории