延长Backbone.Collection原型(extending Backbone.Collect

2019-09-24 03:27发布

从下面的这个问题 ,我想有一些自定义的方法来增强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;
 }
 });

...作品

Answer 1:

你是混合了几个关键概念这就是为什么你没有看到您所期望的行为,这更是一个根本性的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');
});


Answer 2:

确保backbone.jsunderscore.js是做测试之前完全加载。



文章来源: extending Backbone.Collection prototype