Require.js:扩展模块时我可以直接使用原型,还是应该使用extend?

时间:2013-10-31 18:10:24

标签: javascript backbone.js module requirejs underscore.js

如果我使用Require.js管理Backbone.js项目中的模块(也有下划线),在扩展模块时我可以做类似的事情

require(['Home'], function(home) {

    'use strict';

    var view = home.View.prototype;

    _.extend(view,{

        anotherTitle: 'Welcome Jean Luc Picard';

    });
});    

require(['Home'], function(home) {

    'use strict';

    var view = home.View.prototype;

        view.anotherTitle= 'Welcome Jean Luc Picard'; //this is a new attribute

});    

最适合这种方式的是什么?

1 个答案:

答案 0 :(得分:3)

你应该使用extend。

请记住,修改Backbone类型的原型(我假设home.View)将为所有消费者扩展/修改该原型,这可能是意外行为。即使使用require,您也可以直接修改这些依赖项并影响后续的require调用(这是因为您正在修改require缓存中的依赖项,因此不需要发生对相同依赖项的后续请求。)

使用.extend()是创建自己的扩展/自定义类型的最佳方式。在幕后,extend()确实修改了原型,但它是创建的新对象类型的原型,并有效地将骨干类型用作超级。

所以,要创建自己的类型:

// Create a new object whose prototype is the combination of Backbone.View 
// and the object passed to extend
var MyCustomView = Backbone.View.extend({ ... });
var instance = new MyCustomView();

但是,如果home.View已经是自定义视图类型,那么它在功能上可能等同于在其上执行.extend或手动向原型添加内容。但是,为了保持一致性和清晰度,您应该始终使用方便的花花公子extend method来创建子类型。

var MySubCustomView = MyCustomView.extend({ ... });
var instance = new MySubCustomView();