2014-08-27 3 views
1

Итак, пусть у меня был класс в Backbone:Определите, если класс JavaScript расширяет другой класс

var MyModel = Backbone.Model.extend({}); 

Использование оператора InstanceOf я мог проверить продлен ли экземпляр объекта объект:

var instModel = new MyModel(); 
instModel instanceof MyModel; // true 
instModel instanceof Backbone.Model; // true 

Я d хотел бы проверить наследование без создания экземпляра объекта. Есть ли средство в JavaScript или Backbone, чтобы определить, расширяет ли объект без объекта? Так как:

MyModel instanceof Backbone.Model; // false 
MyModel instanceof Function; // true 

ответ

3

Вы можете использовать InstanceOf так:

MyModel.prototype instanceof Backbone.Model 

Это работает, потому что в то время как там нет конкретизированного экземпляра MyModel, вы на самом деле не заботиться о нем, вы заботитесь о своей цепочке прототипов в любом случае, так что вы можете просто проверьте его наследование прототипа.

Заметим, что это не будет работать для конкретной проверки

MyModel.prototype instanceof MyModel 

Это может быть штраф в зависимости от вашего сценария использования, но вы хотите, чтобы работать, у вас есть два варианта:

MyModel === MyModel && MyModel.prototype instanceof MyModel 

// OR 

Object.create(MyModel.prototype) instanceof MyModel 
+0

Хорошее решение. Я знал, что это должно быть что-то простое. Чтобы прояснить будущее читателей, это пропустит один большой случай. 'MyModel.prototype instanceof MyModel' потерпит неудачу. Таким образом, надежная производственная проверка будет выглядеть так: (testModel! == ClassToCheck) && (testModel.prototype instanceof ClassToCheck) ' – stakolee

+0

@stakolee True! Я думал о добавлении примечания об этом и отказался, но, поскольку вы упомянули об этом, я обновил ответ двумя вариантами. – loganfsmyth

0

Вы можете попробовать

Backbone.Model.prototype.isPrototypeOf(MyModel) 

Я не знаком с моделью наследования Магистральная, но instanceof бы предположить, что Backbone.Model классический конструктор JavaScript, и проверьте, используя его прототип. Преимущество isPrototypeOf состоит в том, что вы можете указать прототип напрямую, а не опосредованно через конструктор.

+0

Кажется, что это должно быть то, что мне нужно, просто нужно хэш через него немного больше в моем действительном коде – stakolee

+0

На самом деле, я полагаю, что Магистраль должна выполнять наследование по-своему, минуя случай, который будет зараженPrototypeOf. Приведенный выше пример не работает в моих тестах. – stakolee

+1

Это должен быть '.isPrototypeOf (MyModel.prototype)'. – loganfsmyth

Смежные вопросы