【发布时间】:2016-07-23 04:56:57
【问题描述】:
最近我一直在阅读有关 JavaScript 模式和架构的一般性内容。我经常遇到的一个提示是优先考虑组合而不是继承,所以我花了一天时间深入研究这一点。
了解了组合(更像是 mix'n'match,即通过工厂)相比继承(一种不灵活和模糊的耦合)的优势后,我想知道如何实际使用这些知识,这导致我Mixin pattern。
由于我主要在 Backbone 中进行开发,因此我创建了一个简单的 mixin 以在视图中使用。实际上,我只是将 baseview 的一部分移到了 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
}
});
现在getTemplate 方法被注入到MyView 使用Underscore 的extend 函数,但这与从BaseView 继承有什么不同,它还利用extend 的不同实现调用BaseView.extend ?这甚至是 Backbone 中的真正继承吗?
【问题讨论】:
-
extend() 根本不是继承,它只是一个迭代应用程序。
-
@dandavis 所以在“之前”的例子中说
MyView继承自BaseView是错误的吗?在某种程度上,这对我来说似乎总是伪经典,这就是我问的原因。 -
创建一个
MyView,用一个新函数替换BaseView.getTemplate;您的MyView不受影响。如果它们继承,对一个对象属性所做的更改会影响继承对象的属性。您可以通过使用子对象属性在某种程度上模仿继承,因为如果您将对象更改为一个地方,它会在任何地方更改;这就是.prototype的工作原理……
标签: javascript inheritance backbone.js mixins composition