Вы же помните предыдущий пост про библиотеку для создания объектов на JavaScript? Так вот, я начал разбираться, откуда браузер может брать имена для классов. Как и ожидалось, разработчики браузеров даже и не пытались создать какой-нибудь общий стандарт, и каждый работает так, как ему хочется. Мне удалось обнаружить 2 способа задания имени класса (или 3, смотря как считать). Я, конечно же, могу заблуждаться, и вполне себе возможно существование каких-нибудь других недокументированных вариантов задания имени класса. В комментариях можно мне про это сказать.
Лучше всего дела обстоят у Chrome. Кто бы мог подумать? Он берет имя из функции конструктора вне зависимости от вида записи.
some.namespace.ClassA = function () {};
console.log(new some.namespace.ClassA()); // some.namespace.ClassA
function ClassB () {}
console.log(new ClassB()); // ClassB
var ClassC = function ClassD () {}
console.log(new ClassC()); // ClassD
console.log(new ClassD()); // error: undefined
Вслед за ним идет Firefox с Firebug. Он понимает только указание имени после слова function.
some.namespace.ClassA = function () {};
console.log(new some.namespace.ClassA()); // Object
function ClassB () {}
console.log(new ClassB()); // ClassB
var ClassC = function ClassD () {}
console.log(new ClassC()); // ClassD
console.log(new ClassD()); // error: undefined
С IE и Opera дела обстоят одинаково. Они подписывают только названия встроенных объектов.
some.namespace.ClassA = function () {};
console.log(new some.namespace.ClassA()); // Object
function ClassB () {}
console.log(new ClassB()); // Object
var ClassC = function ClassD () {}
console.log(new ClassC()); // Object
console.log(new ClassD()); // error: undefined
Всё это наводит на мысль, что простым и очевидным способом создавать объекты не получится. Сначала нам понадобится определить браузеров, так как каких-то конкретных доступных фич в данном случае нет. А поскольку единственная возможность задать имя класса — напрямую его указать, то eval
будет нашим лучшим другом. И уже из этого последует тонкая настройка Google Closure Compiler, чтобы он не трогал важные для выполнения скрипта переменные.
Поделюсь секретом: создание классов уже работает, и в скором времени, после еще некоторых правок, я выложу версию 0.1 библиотеки на Github.
Хочется что-то добавить или сказать? Я всегда рад обсудить. Пишите на me@dikmax.name.