从下面的这个问题 ,我想有一些自定义的方法来增强Backbone.Collection。 然而,我发现了控制台和源之间存在一些不一致的行为。
下面是测试寻找
HTML
...
<script type="text/javascript" src="./libs/underscore.js"></script>
<script type="text/javascript" src="./libs/backbone.js"></script>
<script type="text/javascript" src="./libs/backbone-extend.js"></script>
<script type="text/javascript" src="./qunit/qunit.js"></script>
<script type="text/javascript" src="./backbone-extend-tests.js"></script>
</body></html>
骨干-extend.js
Backbone.Collection.prototype.extract = function() {
// placeholder to test binding
return 'foo';
};
骨干-扩大,tests.js
test('extending backbone', function () {
ok(typeof Backbone.Collection.extract == 'function');
console.log(Backbone.Collection.extract); // undefined
});
是否有什么我失踪? 我检查了所有的源加载
JFTR - 这...
_.extend(Backbone.Collection, {extract:function(){return'foo';});
...作品,只是没有使用原型增广方法。 我只是不能确定为什么一个方法的工作原理和其他不,因为为骨干的文档建议原型的扩大(尽管它特别提到模型)。 我想我需要采取引擎盖下更详细的研究...
UPDATE:为后人中,对骨架,extend.js文件放上...
_.extend(Backbone.Collection.prototype, {
extract : function (model) {
var _model = model;
this.remove(model);
return _model;
}
});
...作品
你是混合了几个关键概念这就是为什么你没有看到您所期望的行为,这更是一个根本性的JavaScript问题,而不是完全相关的骨干。
请看下面的构造函数:
var Klass = function() {};
您可以使用调用该constuctor new
关键字,以得到从构造一个实例。
var klassInstance = new Klass();
现在,让我们说,我想补充一点,是提供给所有的 ,从这个构造derivied实例的方法。 为此,我可以使用prototype
对象。
Klass.prototype.instanceMethod = function() { alert('hi'); };
然后,我应该能够使用下面的调用该方法:
klassInstance.instanceMethod();
不过,我也可以添加一个静态函数-我在这方面宽松地使用术语-给构造本身,它可以不必一个实例来调用。
Klass.staticMethod = function() { alert('yo!'); };
这种方法将可直接关闭的构造,但将无法使用-直接-关闭实例。
例如:
klassInstance.staticMethod == undefined
那么,什么是真的错了你的测试是要添加到一个方法prototype
-这将提供给“类”的所有实例的方法-但在你的测试,你直接在“类”本身测试的方法。 这是不一样的东西。
顺便说一句,虽然相关,Backbone.js的提供了一个内置的技工创建内建类型thier的“子类”。 这是静态 .extend()
方法。 这为您提供一个简单的方法来自己的功能添加到基地骨干类。
在你的情况,你会想要做的事,如:
var MyCollection = Backbone.Collection.extend({
extract: function() {
// do whatever
}
})
然后,您可以创建新类,这将有一个实例.extract()
说对他们的方法:
var coll = new MyCollection();
coll.extract();
TL; DR;
最终-回你原来的问题-如果你想这将可在特定类的所有实例的方法,那么你的测试是不正确。 您可能需要新一轮上涨的情况下再次进行测试:
test('extending backbone', function () {
var col = new Backbone.Collection();
ok(typeof col.extract == 'function');
});
或检查prototype
直接的方法-这是一个事实,即subtlely不同的prototype
对象不是只针对一个对象来获得的方法。
test('extending backbone', function () {
ok(typeof Backbone.Collection.prototype.extract == 'function');
});
确保backbone.js
和underscore.js
是做测试之前完全加载。