Подтвердить что ты не робот

Тип настраиваемого объекта Javascript

Как проверить, имеет ли объект javascript определенный тип.

var SomeObject = function() { }
var s1 = new SomeObject();

В вышеприведенном случае typeof s1 вернет "объект". Это не очень полезно. Есть ли способ проверить, является ли s1 типа SomeObject?

4b9b3361

Ответ 2

Что бы вы ни делали, избегайте 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, мне нужна более высокая репутация, чтобы комментировать другие достойные ответы здесь)

Ответ 3

Идея, украденная у 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

Ответ 5

Хотя 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");
    }

...

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