您混淆了一些关键概念,这就是为什么您没有看到您期望的行为,这更多是一个基本的 javascript 问题,与主干不完全相关。
考虑以下构造函数:
var Klass = function() {};
您可以使用以下方式调用该构造函数new
关键字从该构造函数获取实例。
var klassInstance = new Klass();
现在,假设我想添加一个可用于all从该构造函数派生的实例的数量。为此我可以使用prototype
object.
Klass.prototype.instanceMethod = function() { alert('hi'); };
然后我应该能够使用以下命令调用该方法:
klassInstance.instanceMethod();
不过,我还可以添加一个static函数(我在这种情况下宽松地使用这个术语)到构造函数本身,可以在没有实例的情况下调用它。
Klass.staticMethod = function() { alert('yo!'); };
该方法将直接从构造函数中可用,但将not直接从实例中可用。
例如:
klassInstance.staticMethod == undefined
所以你的测试真正的错误在于你向prototype
– 一个可用于该“类”的所有实例的方法 – 但在您的测试中,您直接在“类”本身上测试方法。这不是同一件事。
顺便说一句,虽然相关,但 Backbone.js 提供了一个内置机制来创建内置类型的“子类”。这是static .extend()
方法。这为您提供了一种简单的方法来将您自己的功能添加到基本 Backbone 类中。
在你的情况下,你会想做类似的事情:
var MyCollection = Backbone.Collection.extend({
extract: function() {
// do whatever
}
})
然后,您可以创建新类的实例,该实例将具有.extract()
方法对他们说:
var coll = new MyCollection();
coll.extract();
TL;DR;
最终 - 回到你原来的问题 - 如果你想要一个可用于特定类的所有实例的方法,那么你的test是不正确的。您需要新建一个实例来测试:
test('extending backbone', function () {
var col = new Backbone.Collection();
ok(typeof col.extract == 'function');
});
或者检查prototype
直接用于方法——这有细微的不同,因为prototype
对象不是only为一个对象获取一个方法。
test('extending backbone', function () {
ok(typeof Backbone.Collection.prototype.extract == 'function');
});