- 1
if (!("" instanceof String)) throw new Error("Empty string is not a string");
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+157
if (!("" instanceof String)) throw new Error("Empty string is not a string");
Майкрософт. JScript, ASP.
Поздно уже, надо домой идти.
Есть три класса и две функции, чтобы определить к какому классу отностися объект. fml.
В жабаскрипте есть классы?? Что я проспал???
Там же вроде только тот хак с ассоциативными массивами был?
> typeof String
"function"
> typeof Number
"function"
> typeof Object
"function"
> String instanceof Function
true
> Number instanceof Function
true
> Object instanceof Function
true
Кстати меня всегда удивляла одна мелочь, зачем разрешили писать new без скобок, вот так:
>> Object instanceof Function
>true
>Function instanceof Object
true
В чем-то @wvxvw прав.
Кстати, RegExp в некоторых реализациях - тоже функция, а в других - не очень. И в этом нет никакой логики, просто так получилось.
Нет. Ни с такими же именами, ни с другими.
ECMA-262, 4.2.1 Objects (p.3):
>ECMAScript does not use classes such as those in C++, Smalltalk, or Java.
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
Есть внутреннее свойство [[Class]], которое является строкой, и значение можно получить при помощи вызова `Object.prototype.toString.call(someObj) `.
А классов нет.
Но не нужно упускать из виду главный момент. Логики в жабоскрипте небыло никогда, а все его стандарты - феерический бред. Как Крокфорд говорил в своем автобиографическом интервью: "первый раз, когда я это увидел, я дико смеялся и не мог поверить, что кто-то бы всерьез использовал это недоразумение, но потом я понял, что могло быть и хуже". Ну, ему как бы не с руки хаять жабоскрипт, он на нем практически карьеру сделал, но по глазам видно, когда говорит, сколько неразделенной печали кроется за этим "на первый взгляд...".
Когда весьма неприятные последствия или недоработки всё же выясняются, кардинально менять что-то уже поздно, ибо слишком велик риск поломать миллионы строк унаследованного кода, в который вложенны миллиарды долларов.
С одной стороны - желание сделать "логично" и "правильно", с другой - тяжёлый груз наследия. Угадайте, кто побеждает в этом поединке...
Правдив старый анекдот - серьёзная разработка - как секс. Одна ошибка, и тебе придётся поддерживать её всю жизнь.
А задним умом всяк крепок.
Смысл не в том, что у всех есть проблемы - это и ежу понятно, а в том, что на общем фоне, ну, разве что ВБСкрипт только хуже. Ну есть еще Ант и XSLT, хз, на Коболе писать не приходилось... еще есть масса мелочи типа AWK, всяких там проприетарных языков (особенно таких, которые используют в дико дорогих CI серверах / эмуляторах).
НО... ведь было же до того, как был жабоскрипт. Люди ведь уже к тому времени изобрели хорошие вещи, теория была известна, существовала практика. И тем не менее, это говно живет и здравствует и по сей день :(
ЗЫ. А вот и та самая цитата, нашел таки:
Ну да не суть. Так вот, проект - отборное говно, и всегда таким был, но люди которые над ним работали потеряли какую-либо надежду его исправить в виду просто феноменального идиотизма изначальных авторов. Но со временем это изза того, что проект не развивался а "поддерживался", он на столько ухудшился, что сейчас при всем большом желании с ним уже ничего не поделать. Но, как говорит один из старожилов "но оно же, сука, работает!"
Жабоскрипт находится в очень похожей ситуации: он не развивается, это уебищная система, которая должна была умереть много лет назад, примерно тогда же, когда должен был умереть XML, sendmail, HTTP и HTML но все эти технологии каким-то образом продолжают существовать и их аудитория только увеличивается :(
P.S. Firefox 18+ достаточно быстр, чтобы прямо из него играть в порт Cube3D на JS (yandex:Bananabread). Пока ещё проба технологии, но за этим будущее.
Автор - лол.
Ну да не важно, а важно то, что незыблимые основы не были такими незыблимыми несколько лет назад, и в ЕС4 было принято решение сделать так, чтобы new String("foo") и "foo" были бы одним и тем же. Поразительная находка, после полутора десятков лет мытарств и недоумений закрадывавшихся порой в обьзьянью умы "жабоскрипт программистов". Но потом решили, да ну и хер с ним, сделать из этого говна все равно ничего путнего не получится, ну так вернем все как было, пусть обезьянки еще порезвятся немного.
Вот ваши "инстансы":
console.log(obj.constructor == Object);
console.log(obj.constructor == Array);
console.log(obj.constructor == String);
console.log(obj.constructor == Number);
console.log(obj.constructor == Boolean);
и т.д по кастомным..
Реализует вашу задачу? Да.
В чем проблема?
Нужно узнать внутренний класс - как уже выше было сказано:
Нужно проверить нахождение в цепочке прототипов - instanceof, isPrototypeOf.
Всё.
У языка изначально своя концепция.
Почему бы не принять её такой, какая она есть, а не навешивать "удобные" баребухи?
А вот 90% мартышек делает просто:
Концепция у js своя и этот ваш constructor оставьте себе - Object.create куда прототипному языку ближе.