Хорошо, ребята, я уже несколько лет медленно разрабатываю метод «поймай все», лол! Хитрость заключается в том, чтобы:
- Есть механизм для создания классов.
- Иметь механизм для проверки всех пользовательских классов, примитивов и значений, созданных / сгенерированных нативными конструкторами.
- Иметь механизм для расширения созданных пользователем классов в новые так, чтобы вышеуказанная функциональность проникала через ваш код / приложение / библиотеку / и т.д ..
Для примера (или посмотреть, как я справился с проблемой), посмотрите следующий код на github: https://github.com/elycruz/sjljs/blob/master/src/sjl/sjl.js и найдите:
classOf =
,
classOfIs =
и или
defineSubClass =
(без обратных кавычек (`)).
Как видите, у меня есть некоторые механизмы, чтобы заставить classOf
всегда давать мне имя типа class / constructors независимо от того, является ли он примитивом, определяемым пользователем классом, значением, созданным с помощью собственного конструктора, Null , NaN и т. Д. Для каждого значения javascript я получу уникальное имя типа из функции classOf
. Кроме того, я могу передать фактические конструкторы в sjl.classOfIs
, чтобы проверить тип значения в дополнение к возможности передать его имя типа! Так, например:
`` `
// Пожалуйста, прости длинные пространства имен! Я понятия не имел о воздействии, пока не использовал их некоторое время (они сосут хаха)
var SomeCustomClass = sjl.package.stdlib.Extendable.extend({
constructor: function SomeCustomClass () {},
// ...
}),
HelloIterator = sjl.ns.stdlib.Iterator.extend(
function HelloIterator () {},
{ /* ... methods here ... */ },
{ /* ... static props/methods here ... */ }
),
helloIt = new HelloIterator();
sjl.classOfIs(new SomeCustomClass(), SomeCustomClass) === true; // `true`
sjl.classOfIs(helloIt, HelloIterator) === true; // `true`
var someString = 'helloworld';
sjl.classOfIs(someString, String) === true; // `true`
sjl.classOfIs(99, Number) === true; // true
sjl.classOf(NaN) === 'NaN'; // true
sjl.classOf(new Map()) === 'Map';
sjl.classOf(new Set()) === 'Set';
sjl.classOfIs([1, 2, 4], Array) === true; // `true`
// etc..
// Also optionally the type you want to check against could be the type's name
sjl.classOfIs(['a', 'b', 'c'], 'Array') === true; // `true`!
sjl.classOfIs(helloIt, 'HelloIterator') === true; // `true`!
`` `
Если вы хотите узнать больше о том, как я использую вышеупомянутую настройку, взгляните на репозиторий: https://github.com/elycruz/sjljs
Также книги с содержанием по теме:
- «Шаблоны JavaScript» Стояна Стефанова.
- «Javascript - Полное руководство». Дэвид Фланаган.
- и многие другие .. (поиск в сети).
Также вы можете быстро протестировать функции, о которых я говорю, здесь:
- http://sjljs.elycruz.com/0.5.18/tests/for-browser/ (также в пути 0.5.18 в url есть источники из github минус node_modules и тому подобное).
Счастливого кодирования!