Ответ 1
Да, используя instanceof
(ссылка MDN | spec link):
if (s1 instanceof SomeObject) { ... }
Как проверить, имеет ли объект javascript определенный тип.
var SomeObject = function() { }
var s1 = new SomeObject();
В вышеприведенном случае typeof s1
вернет "объект". Это не очень полезно. Есть ли способ проверить, является ли s1 типа SomeObject?
Да, используя instanceof
(ссылка MDN | spec link):
if (s1 instanceof SomeObject) { ... }
Что бы вы ни делали, избегайте obj.constructor.name или любой строковой версии конструктора. Это отлично работает, пока вы не угадаете/не уменьшаете свой код, тогда он все ломается, поскольку конструктор переименовывается в нечто непонятное (например: "n" ), и ваш код все равно будет делать это и никогда не будет соответствовать:
// Note: when uglified, the constructor may be renamed to 'n' (or whatever),
// which breaks this code since the strings are left alone.
if (obj.constructor.name === 'SomeObject') {}
Примечание:
// Even if uglified/minified, this will work since SomeObject will
// universally be changed to something like 'n'.
if (obj instanceof SomeObject) {}
(BTW, мне нужна более высокая репутация, чтобы комментировать другие достойные ответы здесь)
Идея, украденная у http://phpjs.org/functions/get_class/, опубликована SeanJA. Разрушено для работы только с объектами и без необходимости регулярного выражения:
function GetInstanceType(obj)
{
var str = obj.constructor.toString();
return str.substring(9, str.indexOf("("));
}
function Foo() {
this.abc = 123;
}
// will print "Foo"
GetInstanceType(new Foo());
Я только что узнал более простой способ извлечь имя функции из конструктора:
obj.constructor.name
Вы также можете посмотреть, как они это делают в php.js:
Хотя instanceof - правильный ответ, это, конечно, уродливый синтаксис. Я предлагаю, что если вы создаете пользовательские объекты, вы можете добавить свое собственное свойство для типа и проверить это следующим образом...
var Car = function(){
this.type = Object.defineProperty(this, "type", {value:"Car"});
}
Это создаст неизменяемое свойство с именем type, которое живет с объектом. Если бы вы использовали синтаксис класса, вы могли бы сделать его статичным.
... где-то позже...
function addCar(car){
if (car.type != "Car"){
throw Error("invalid type for car");
}
...
Я думаю, что это решение легко внедрить, оно более интуитивно понятно и, следовательно, проще для других в использовании и обслуживании.