JavaScript: пользовательские исключения

В JavaScript есть обработка исключений. try-catch-finally, throw, всё как у взрослых. Большинство программистов, правда, ими не пользуется, но не в этом суть.

И вот мы пишем, допустим, библиотеку и хотим, чтобы её функции в случае чего бросали определённые исключения. Язык позволяет нам здесь бросать что угодно, например, строку: throw "Ой, ошибка, ошибка!";.

Но, это не наш путь. Есть предопределённые типы ошибок, унаследованные от Error и есть стандарт, который говорит нам об объекте с полями name и message.

MDN показывает нам, как сделать свой «класс» исключений, унаследованный от Error:

// Create a new object, that prototypally inherits from the Error constructor.
function MyError(message) {
    this.name = "MyError";
    this.message = message || "Default Message";
}
MyError.prototype = new Error();
MyError.prototype.constructor = MyError;

Мозиловцы правда здесь согрешили и использовали для создания прототипа рабочий конструктор Error. Сделаем по правильному:
Остальной текст под катом

Вторничнее утро философствования

Ни одному автору, к сожалению, не дано решать, что из того, что он сделает понравится публике, а что нет. А может к счастью, а не к сожалению.

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

Ну или, взять, кого-нибудь более значимого. Артур Конан Дойль считал себя крупным учёным и историком. Всю жизнь какие-то многотомные исторические труды писал. Да ещё про затерянные миры и дезинтеграционные машины. С бригадиром жераром, как с писаной торбой носился. Спиритизмом увлекался.

А глупой публике подавай только шерлокхолмса. Как он нервничал, бедный. Он тут такие серьёзные труды пишет, а им эту пошлятину подавай. Сколько раз он этого Холмса убивал, а ему тут же со всей Англии барышни пишут и в письмах ноют. Так и остался на всю жизнь автором одного героя. До сих пор, наверное, в земле ворочается.

Вот и гуглята теперь не слишком умным людям стараются объяснить положение дел. RSS — мёртвая технология. Кому она нужна, когда есть прекрасный гуглоплюс? Мы вообще этот ридер делали, чисто, поржать.

А люди не понимают, насколько прекрасен гуглоплюс. Глупые, глупые люди. Тёмное страшное время…

Javascript: объекты vs структуры

Как мы рассмотрели в прошлых статьях, система типов в JavaScript не так, чтобы уж очень стройная.

И есть ещё один теоретический нюанс. Object в JS, по-сути, отвечает за две совершенно различные сущности.

С одной стороны это объект из ООП: отдельная индивидуальность со своим поведением и интерфейсом.

С другой: хранилище структурированных данных. Тоже, что и struct в Си, Dict в Питоне, Hash в Перле или ассоциативные массивы в PHP.
В питоне Dict, конечно, тоже объект, но там мы чётко можем разобрать — это словарь а не что-то иное. В JS разобрать это сложнее.
Остальной текст под катом

JavaScript: типы, классы и фреймы

С год назад мы тут разбирались с определением типов в JavaScript.

Рассмотрим ещё один аспект: фреймы. Из фрейма во фрейм можно передавать данные.

Например, у нас есть функция, которая обрабатывает массив немного по другому, чем объект:

function func(value) {
    if (value instanceof Array) {
        // массив
    } else {
        // объект
    }
}

И на странице есть iframe, в котором следующее:

window.parent.func([1, 2, 3]);

Это будет работать некорректно. Так как мы сравниваем значение с нашим Array из нашего основного окна. А значение создано во фрейме, в котором свой window и свой window.Array и именно от него производится этот массив.
Остальной текст под катом

Function Expression и ебучий осёл

В JavaScript, как известно, есть два способа объявить функцию.

/* Function Declaration. Функция сразу определяется в локальном контексте под именем func */
function func() {
 
}

и

/* Function Expression.  */
var func; // func просто переменная. Изначально в ней, как обычно, undefined.
 
func = (function () {}); // В определённый момент в качестве значения ей присваивается объект функции.

FE ещё называют анонимной функцией.

И есть ещё один подвид Function Expression. Именованное (Named) Function Expression:

var func;
 
func = (function fufunc() { /* ... */ });

Анонимная неанонимная функция :).

В нашем локальном контексте по прежнему есть переменная func.
Но в контексте вызываемой функции также появляется её «имя» fufunc.
Остальной текст под катом

WordPress: похожие посты (хардкор-вариант)

Задача: в wordpress’е после статьи выводить список «похожие статьи».

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

По запросу «wordpress similar posts» можно найти множество плагинов данной тематики. У них у всех отличный код, подробная документация и богатый набор настроек. Единственный минус: вместо похожих постов они выводят какую-то рандомную хероту.
Остальной текст под катом

[без названия]

Есть вот, допустим, компания-хостер. И предоставляет она услуги виртуального хостинга.
И всё с первого взгляда у них хорошо. И сервис отличный и саппорт отзывчивый.
И даже дают ssh-доступ к аккаунту.
И на сайте приведены подробные руководства, как, например, простому веб-мастеру настроить себе cron, через crontab.

И тут простой веб-мастер расслабляется и попадается в коварную ловушку. Потому, что редактор по умолчанию у них на сервере — VI.

Господи, кто рожает таких людей, которые подсовывают простым людям VI? Почему у них полностью атрофировано понятие о добре и зле? Как они могут спокойно спать и завтракать по утрам?