войти зарегистрироваться

JavaScriptСамовызывающийся конструктор Джона Резига и размышление о том, почему это решение не прижилось

Настала пора мысленно вернуться на четыре с небольшим года назад ко блогозаписи «Simple “Class” Instantiation» из блога Джона Резига, прославленного создателя необыкновенно удобной библиотеки jQuery. И вернёмся.

Однако же, так как я вовсе не вижу её в результатах поиска на Хабрахабре по слову «Resig», то поневоле приходится думать, что эту полезную блогозапись никто не удосужился перевести (или хотя бы пересказать) за четыре прошедших года — мне придётся, стало быть, самостоятельно пересказать блогозапись Резига прежде, чем я исполню моё главное намерение: поразмыслить вслух, почему же предложенный Резигом способ решения указанной им проблемы так и не сделался общераспространённым. И перескажу. (Сам этот пересказ ужé был бы полезен читателю, даже кабы я к нему ничего от себя не прибавил. А я прибавлю.)



Шестого декабря 2007 года Резиг рассмотрел, что получается, когда в джаваскрипте используется операция «new» для создания объекта (в языках с классами мы сказали бы «экземпляра класса»):

function User(first, last){
   this.name = first + " " + last;
}

var user = new User("John", "Resig");

Резиг справедливо подметил, что для начинающих программистов на джаваскрипте не вполне очевидно, что появление «this» в коде функции указывает на то, что перед нами конструктор объекта. (Я от себя в скобках прибавлю: если функция находится в недрах некоторой библиотеки, то это обстоятельство нуждается также и в документировании — а не то пользователь библиотеки не многим будет отличаться от новичка: исходный код с телом функции читают не все, тем более что он нередко применяется в минифицированном, не читаемом виде.)

Поэтому, рассудил Резиг, рано или поздно кто-нибудь попробует вызвать «User()» без «new» и тем получит на свою голову сразу две неприятные проблемы. Во-первых, переменная «user» останется неопределённою: функция «User()» задумана ведь как конструктор, а значения она никакого не возвращает. Во-вторых, что ещё хуже, попытки обращения к «this» изнутри такого (некорректно вызванного) конструктора неизбежно приведёт к засорению глобального пространства имён — а это чревато зловещими и трудноуловимыми последствиями. Обе проблемы Джон Резиг продемонстрировал на примере:

var name = "Resig";
var user = User("John", name);
// здесь переменная «user» не определена
// БОЛЕЕ ТОГО: значение «name» теперь ужé не «Resig»!
if ( name == "John Resig" ) {
   // фигассе!…
}

Гаджеты. Устройства для гиковProtoSnap — интересный «конструктор» для начинающего электронщика



Сайт sparkfun на днях представил интересный проект, ProtoSnap, который представляет собой нечто вроде конструктора для любителей электроники, правда, не для профи, а для новичков. Это обучающий комплект, который позволяет начинающему электронщику практиковаться в создании различных устройств и модулей. По словам разработчиков, такой комплект идеально подходит для студентов, изобретателей, инженеров разного рода. В общем, для всех, кто неравнодушен к электронике, и желает самостоятельно собрать что-нибудь эдакое. В рамках проекта разработано три вида комплектов ProtoSnap.

JavaScriptСоздание объектов в Javascript из песочницы

Гибкость Javascript позволяет создавать объекты множеством способов. Но как это нередко случается, разнообразие таит в себе множество подводных камней. Из этой статьи Вы узнаете о том, как разглядеть и обогнуть эти опасные рифы.

Веб-разработкаАпрельские азбучные истины в «Smashing Magazine»

Вот и подходит к концу весенний месяц апрель. За этот месяц в «Smashing Magazine» появились две небезынтересные статьи, полные истин более или менее азбучных. И так как иногда хочется перечитывать и азы, чтобы не упустить из вида и сознания ничего существенного, то я вам эти статьи порекомендую.

«Seven Javascript Things I Wish I Knew Much Earlier In My Career» — статья о том, как сочинять код джаваскриптов, чтобы как можно менее утруждать себя. Вместо конструкторов Object() и Array() использовать краткую запись, вместо условий записывать тернарный оператор «a? b: c», по возможности пользоваться встроенной сортировкою и обработкою вместо своей самописной, применять JSON и делегировать события, и так далее. Всё это — с примерами кода.

«Maps In Modern Web Design: Showcase and Examples» — статья об употреблении географических карт на сайтах. Никакого кода, зато масса красивых иллюстраций картографического и геоинформационного характера с подтекстом: делайте так, и сайт ваш будет красив и удобен.
Вы видели когда-нибудь, как выглядит карта покрытия 2G на сайте «Билайна» в Краснодарском крае и Адыгее? Уверен: если бы создатели этого сайта читали «Smashing Magazine», то у них бы получилось чуточку лучше. (Я уж не говорю про их же страницу сети 3G, где вообще нельзя ничего понять о покрытии.)

Старое железоЭлектронный конструктор (ЭКОН-02 vs Знаток)

Как то разговорились с коллегой по работе об электронных конструкторах, оказалось у него дома на полках пылится Экон-02. В моем детстве такого счастья не было и я очень захотел, чтобы у моего сына был какой то аналог Экон-02.электронный конструктор Экон-02
НЛО прилетело и опубликовало эту надпись здесь.

Социальные сетиСети. Такие разные конструкторы

Немного больше недели назад на Хабре вышла статья про социальные конструкторы , но в ней почему-то было рассказано только про два из них- Taba и Ning. Почему-то казалось, что таких конструкторов больше, чем два=) А ведь можно еще брать и социальные сети, которые могут выполнять функцию конструктора – тогда их будет гораздо больше, чем два. Проведя некоторое количество времени и вспомнив социальные сети, которые когда-либо видела, получается интересная картина. Все социальные площадки, с помощью которых можно объединить людей вокруг какой-той темы, сделать свое сообщество или группу, в общем, можно условно разделить на три основных блока: 1) потребительские сети 2) корпоративные сети и 3) сети для бизнеса.

Гаджеты. Устройства для гиковЭлектрическая машина за $500

Все мы прекрасно помним чудесные разработки многомилионной компании Tesla. Суперкар, в будущем седан.

Но не только в России есть мастера на все руки. Механик на пенсии из Калифорнии Роберт Ландж создал свою электрическую машину за $500.

image

ЖелезоТранзистор из человеческих ДНК

Пару лет назад американский биолог Пол Ротмунд обнаружил, что молекулы ДНК обладают способностью к самосборке в различные правильные геометрические формы — треугольники, квадраты, звёздочки и т.д. (работа Ротмунда в PDF). Это действительно интересное открытие (оно вошло в список 12 самых важных научных открытий 2006 года) теоретически позволяет сделать из нашего ДНК нечто вроде конструктора «Лего».



Практическая реализация такой возможности не заставила себя долго ждать.

C++Безопасные конструкторы

domino.jpg - Picamatic - upload your imagesНедавняя статья о порядке инициализации членов класса вызвала весьма любопытную дискуссию, в которой, среди прочих, обсуждался вопрос, как правильно оформлять члены класса, хранить ли их по значению и организовывать конструктор так:

A::A(int x) : b(x) {}

Или хранить их по ссылке:

A::A(int x) { b = new B(x); }

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