Backbone Marionette: 在扩展对象时将方法放在 instance/constructor 或原型上

Backbone Marionette: put methods on instance/constructor or prototype when extending objects

我必须从头开始制作一个 backbone+marionette webapp,这是我从未做过的,而且我在基本代码结构上苦苦挣扎。

我理解 JavaScript 在构造函数(为每个实例重新创建)或原型(在实例之间共享)上拥有方法的概念。

然而,我正在努力弄清楚在扩展 backbone 模型和 marionette 视图时如何将其转化为最简单的语法来完成这项工作。

这个 post 似乎详细解释了我的问题,但是他们最终用于扩展视图的语法非常复杂,我决定在 [=38 之上使用 Marionette 的原因=]就是抽象出这样的结构代码,利用它们更高级的视图类型:

http://blog.scottlogic.com/2012/12/14/view-inheritance-in-backbone.html

marionette 'options' 似乎是一种将属性附加到实例或原型的方法,但我不确定如何在示例中使用它们:

http://marionettejs.com/docs/v2.4.5/marionette.functions.html#marionettemergeoptions

所以假设我想构建一个从 Marionette CompositeView 扩展的 CaseView 并具有 learnerCompleted 方法。我希望 learnerCompleted 方法继续我的 CaseView 原型,因为我不希望为我的 600 个案例视图实例中的每一个实例重新创建该方法。但是我不希望 learnerCompleted 方法继续使用 Marionette CompositeView 原型,因为我有另一个视图类型 CategoryView 也从 Marionette CompositeView 扩展但不需要 learnerCompleted 方法。

利用内置 Marionette 功能实现此目的的最简单语法是什么?我认为 scottlogic 博客 post 提供了一个解决方案,但语法很复杂,我想知道是否有更简单的方法使用内置 Marionette 实用程序来实现相同的目的。

非常感谢您的帮助!

您可以通过扩展 Marionette 的 CompositeView 并指定 learnerCompleted 函数来完成此操作。

var CaseView = Backbone.Marionette.CompositeView.extend({
  learnerCompleted: function() {
    /* ... */
  }
});

var CategoryView = Backbone.Marionette.CompositeView.extend({
});

通过上述,learnerCompleted 函数被放在 CaseView 原型上,而不是 Marionette 的 CompositeView。因此,没有为您的 CategoryView.

定义 learnerCompleted 函数

我创建了一个简单的 fiddle 来展示这个:https://jsfiddle.net/jdrap2yk/