Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 扩展主干。集合原型_Javascript_Backbone.js_Qunit - Fatal编程技术网

Javascript 扩展主干。集合原型

Javascript 扩展主干。集合原型,javascript,backbone.js,qunit,Javascript,Backbone.js,Qunit,继之后,我尝试使用一些自定义方法来扩充Backbone.Collection。但是,我发现控制台和源代码之间存在一些不一致的行为 下面是测试结果 HTML ... <script type="text/javascript" src="./libs/underscore.js"></script> <script type="text/javascript" src="./libs/backbone.js"></script> <scrip

继之后,我尝试使用一些自定义方法来扩充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>
主干扩展测试.js

Backbone.Collection.prototype.extract = function() {
    // placeholder to test binding
    return 'foo';
};
test('extending backbone', function () {
    ok(typeof Backbone.Collection.extract == 'function');
    console.log(Backbone.Collection.extract); // undefined
});
有什么我遗漏的吗?我已经检查过所有的源代码都在加载

JFTR-这个

_.extend(Backbone.Collection, {extract:function(){return'foo';});
…有效,只是不使用原型增强方法。我只是不确定为什么一种方法有效,而另一种方法无效,因为主干原型增强的文档(尽管它特别提到了模型)。我想我需要更详细地看看引擎盖下面

更新: 对于子孙后代,请将其放入backbone-extend.js文件中

 _.extend(Backbone.Collection.prototype, {
     extract : function (model) {
     var _model = model;
     this.remove(model);
     return _model;
 }
 });

。。。工作

在进行测试之前,确保
主干.js
下划线.js
已完全加载。

您混淆了一些关键概念,这就是为什么您没有看到预期的行为,这是一个更基本的javascript问题,与主干无关

考虑以下构造函数:

var Klass = function() {};
您可以使用
new
关键字调用该构造函数以从该构造函数获取实例

var klassInstance = new Klass();
现在,假设我想添加一个方法,该方法可用于从该构造函数派生的所有实例。为此,我可以使用
原型
对象

Klass.prototype.instanceMethod = function() { alert('hi'); };
然后,我应该能够使用以下方法调用该方法:

klassInstance.instanceMethod();
但是,我也可以向构造函数本身添加一个静态函数——在本文中我松散地使用了这个术语——可以在没有实例的情况下调用它

Klass.staticMethod = function() { alert('yo!'); };
此方法将直接从构造函数中可用,但不会直接从实例中可用

例如:

klassInstance.staticMethod == undefined
因此,您的测试的真正错误在于,您正在将一个方法添加到
原型
——该方法将可用于该“类”的所有实例——但在您的测试中,您直接在“类”本身上测试一个方法。这不是一回事


另一方面,尽管相关,Backbone.js提供了一个内置机制来创建其内置类型的“子类”。这是静态的
.extend()
方法。这为您提供了一种将自己的功能添加到基本主干类的简单方法

在您的情况下,您可能希望执行以下操作:

var MyCollection = Backbone.Collection.extend({
    extract: function() {
        // do whatever
    }
}) 
然后,您可以创建新类的实例,这些实例上有一个
.extract()
方法,方法如下:

var coll = new MyCollection();
coll.extract();

TL;博士 归根结底,回到你最初的问题上,如果你想要一个在特定类的所有实例上都可用的方法,那么你的测试是不正确的。您需要新建一个实例进行测试:

test('extending backbone', function () {
    var col = new Backbone.Collection();
    ok(typeof col.extract == 'function');
});
或者直接检查
prototype
以获得方法–这与
prototype
对象不是唯一一个对象获得方法的事实有细微的不同

test('extending backbone', function () {
    ok(typeof Backbone.Collection.prototype.extract == 'function');
});

等等,您是否正在尝试向类或类的实例添加方法。这不是一回事。如果要使用backbones build in
extend
,为什么不使用backbones in
extend呢?我正在尝试向类添加一个方法,以便所有集合都有一个“extract”方法。如果你回答我最初的问题,我想要一个方法,在调用Backbone.Collection.remove()时返回项目。我不完全确定你是否明白我的意思。嗯,这是我的第一个想法,因为Backbone是一个非常大的文件,所以我只是将我的原型工作附加到Backbone文件本身。仍然不走运-我可能会尝试使用require.js来确保这些都已正确排队。感谢您花时间回复这些细节。虽然“静态”方法对我来说是新的,但我仍在摸索增强原型和实例之间的区别。因为我想增加所有主干集合,所以我需要增加它的原型-不确定为什么手动扩展原型不起作用,但是使用.extend完成了这个技巧。。。