- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我一直在阅读有关 JavaScript 模式和架构的一般知识。我经常遇到的一个建议是优先考虑组合而不是继承,所以我花了一天时间对此进行了更深入的研究。
在了解了组合(更像是 mix'n'match,即通过工厂)与继承(一种不灵活且模糊的耦合)相比的优势之后,我想知道如何实际利用这些知识,这使我Mixin pattern .
由于我主要在 Backbone 中进行开发,因此我创建了一个简单的 mixin 以在 View 中使用。实际上,我只是将基础 View 的一部分移到了 mixin 中:
之前:
var BaseView = Backbone.View.extend({
getTemplate: function () {
return template;
}
});
var MyView = BaseView.extend({
template: 'dummy',
initialize: function () {
// Do stuff
},
render: function () {
// Do render stuff
}
});
之后:
var myMixin = {
getTemplate: function () {
return template;
}
};
var MyView = Backbone.View.extend({
template: 'dummy'
initialize: function () {
_.extend(this, myMixin)
// Do stuff
},
render: function () {
// Do render stuff
}
});
现在使用Underscore的extend
函数将getTemplate
方法注入(inject)到MyView
中,但这与继承BaseView<有什么不同
,它还使用了 extend
调用 BaseView.extend
的不同实现?这还是 Backbone 中真正的继承吗?
最佳答案
我确信您在职业生涯中遇到过“合并”一词没有明确定义的情况。 “Mixin”在其他语言和概念中具有精确的含义,但在 Javascript 中,它具有与“merge”相同水平的精确性和良好定义,也就是说,不多。
您正确地指出,在这两种情况下您都得到 _.extend
的结果。这是您特定选择mixin
的结果。实现...即调用 _.extend
在initialize
.
mixin
还有其他选择具有更奇特和有用的逻辑来处理合并键等中的冲突。 backbone.cocktail
我记得是这样的。
如果您还没有看过extend
从带注释的来源,请执行以下操作。
var 扩展 = 函数(protoProps, staticProps) { var 父级 = this; var child ;
我们从函数 extend
开始的签名...
The constructor function for the new subclass is either defined by you (the “constructor” property in your extend definition), or defaulted by us to simply call the parent constructor.
if (protoProps && _.has(protoProps, 'constructor')) {
child = protoProps.constructor;
} else {
child = function(){ return parent.apply(this, arguments); };
}
换句话说,要么我们已经有子级的构造函数,要么没有,在这种情况下它会获得父级。
Add static properties to the constructor function, if supplied.
_.extend(child, parent, staticProps);
Set the prototype chain to inherit from parent, without calling parent‘s constructor function and add the prototype properties.
child.prototype = _.create(parent.prototype, protoProps);
child.prototype.constructor = child;
这是微妙但非常重要。请注意,他们本来可以这样做:child.prototype = parent.prototype
。想想为什么他们没有这样做,以及这对你有什么好处。
顺便说一句,这两行是整个方法的核心,因为它 1) 为子级提供了自己的父级原型(prototype)副本,并为子级构造函数提供了原型(prototype)。因此,您得到的原型(prototype)对于 child 来说确实是独一无二的,但源自 parent 。
Set a convenience property in case the parent’s prototype is needed later.
child.__super__ = parent.prototype;
return child;
};
下划线扩展是 merging
的一种方法。它是 Backbone.extend
流程的一部分但另一部分涉及实现inheritance
.
现在是 mixin 库 cocktail
对于 Backbone
为您提供比 underscore
更智能的合并处理,因此如果您愿意 extending
,您可能想要寻求更多选择太多了。
https://github.com/onsi/cocktail
嗯,我并不是声称完全实现了 diff
比如说,extending
之间来自哈希值和 mixin
一个哈希,但我确实知道一些重要的事情。
首先,extend
采用第二个参数:)很多人不知道。
var extend = function(protoProps, staticProps) {
有时我看到人们使用 mixin
因为他们想要持续改变通过 staticProps
可以实现的目标.
第二,extend
在语义上将扩展关联到 Clazz
... 100 次中有 99 次,您看不到 extend
的输入重复使用。
关于javascript - Backbone 中的 Mixin 模式 - 它与 Backbone 的扩展实现有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36389296/
我有一个主 View 负责呈现其他 View ...... 这是完整的代码 (1) (2) (3)。 当我第一次加载 View (View1、View2、View3)时,一切正常。 然后,如果我尝试重
我正在第一次尝试使用 Backbone.Marionette,并想知道当一个简单的 Backbone.View 就足够了时,是否有任何理由使用 Backbone.Marionette.ItemView
我正在尝试将 Backbone Validation 与 Backbone Stickit 结合使用,我希望在用户输入时一次验证一个属性。但是,当用户输入一个值时,模型上的所有属性都会得到验证,而不仅
我在结合使用 T. Hedersen 的 backbone.validation 插件 ( https://github.com/thedersen/backbone.validation ) 和 D
在下面编辑了这个 在下图中,我有两个主要区域。 左边的用户列表:allusersRegion 另一个用于显示布局的右侧,其中包含在 allusersRegion 中单击的用户的唯一属性和用户的文章列表
如果您单击链接,我的主干路由器工作正常,但在尝试直接访问 URL 或刷新页面时不起作用。 路由器 var app = app || {}; var appRouter = Backbone.Route
我想创建一个 Backbone 模型并将另一个模型的集合存储到它的属性中。所以,有父子模型。每个父级都有一个或多个子级存储在其属性中的数组中。 JSON 将是这样的。 Parent = { n
我正在使用 Backbone 和木偶, 我想对我的收藏和渲染 View 进行排序。 但是发生了一些奇怪的事情。 '/api/note/getList' ,它返回(并在集合被 View 初始化时调用)
我有一个相当通用的模型,并且正在收集该模型(请参见下文),作为一系列观点的基础。在几种 View 上,选择一个模型会生成操作(通过“selected”属性),我需要能够仅在客户端跟踪选择。 但是,似乎
这是一个单一的问题,但我对这是否是一个好习惯这一事实深有感触。 基本上,假设我们有这个微不足道的场景: (function(){ window.App = { Models: {},
我正在使用 Signalr 集线器订阅服务器上的事件。将什么事件分派(dispatch)到集线器,它成功地将项目添加到 Marionette CollectionView。反过来,这会呈现到表格中。
我正在使用 require js 和 Backbone 为 android 开发应用程序。我必须通过 touchend 事件将从集合中获取的模型传递给路由器。我该怎么做? define(["jquer
我有一个 Backbone 集合。如何对集合进行切片,或者至少将列表截断为特定长度? 最佳答案 假设您已经定义并初始化了您的集合,并且您想要改变集合(就地更改),您必须执行以下操作: collecti
我有一个集合,其中有一个添加模型时会触发的事件。我已经在文档中阅读了应该具有options参数但无法获取的参数。 我基本上想在集合中找到模型所在的索引。 在我的收藏夹中,我有这个。 initi
从集合中删除模型时,如何获取模型的索引。 在下面的代码中有一个回调函数 doSomething(){} ,它在 remove 被触发时被调用,我希望索引在那里。 Backbone 文档说“移除前模型的
在项目中同时使用Polymer和Backbone是否有任何限制? 我想不出什么具体的东西,但我想我会在匆忙之前先问清楚。有人可能已经同他们一起工作过,并且发现了某种不兼容之处。 欢迎任何反馈和经验分享
我正在使用bone.js编写应用程序,并在页面之间进行动画处理(有点像iPhone风格的ui)。因此,当您单击按钮时,下一页将从右侧滑入,而单击后退按钮将使下一页从左侧滑入。我希望能够使用路由器对浏览
我刚刚开始学习ribs.js。我在理解如何/何时使用模型和集合时遇到问题。我在网上找到了几个教程,每个教程都使用不同的方法来构建应用程序。在某些情况下,是从Collection对象的REST API中
我有一个由 REST API 给出的模型,其中一个名称的属性是这样的: defaults: { ... "user-name" : "", ... } 然后当我尝试通过这种方式在模板中呈现它时: U
我有一个 Backbone 应用程序,它从我使用 Backbone 的代码中的不同位置不确定地获取错误 Backbone is not defined 。有时它会先加载然后加载网站,有时则不会。我将以
我是一名优秀的程序员,十分优秀!