22

作为我对骨干项目的单元测试(使用 QUnit)的一部分,我测试了一些返回骨干模型数组的集合操作函数。

有没有办法直接测试(为了理智起见)我的数组中的对象是否扩展 Backbone.Model 或者我应该只做一个鸭子类型检查(如果是这样,如何以及在哪个唯一属性上)?

由于 javascript 中没有真正的“类”构造,typeof因此显然不会在这里解决问题。

我可以看到这在我的 Collections 的其他测试中很有用,或者检查事物是否是我的特定 Backbone 类的实例等。

4

2 回答 2

38

如何使用instanceof

console.log(yourObject instanceof Backbone.Model);

instanceof 运算符测试对象的原型链中是否具有构造函数的原型属性。

于 2012-06-02T15:18:03.200 回答
3

对对象类型的检查是 JavaScript 等语言中的代码异味。

如果您需要在调用特定方法时知道您的集合正在返回特定模型,请使用已知模型填充集合并与这些模型进行比较。

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

MyCollection = Backbone.Collection.extend({
  model: MyModel,

  getThatOne: function(){
    return this.at[0];
  }
});


m1 = new MyModel();
m2 = new MyModel();

col = new MyCollection([m1, m2]);

retrieved = col.getThatOne();

retrieved === m1 //=> true
于 2012-06-02T20:15:45.517 回答