Inheritance CoffesScript中的继承不';由于lodash合并功能,无法正常工作
我在CoffeeScript中使用Backbone.js编程,在继承lodash和合并函数时遇到问题 有一个超类Inheritance CoffesScript中的继承不';由于lodash合并功能,无法正常工作,inheritance,backbone.js,coffeescript,lodash,Inheritance,Backbone.js,Coffeescript,Lodash,我在CoffeeScript中使用Backbone.js编程,在继承lodash和合并函数时遇到问题 有一个超类 class NavigationView extends Backbone.View config: test: string: "Test" 以及由此派生的两个类 class SubView extends NavigationView initialize: -> # Setting the view's template pro
class NavigationView extends Backbone.View
config:
test:
string: "Test"
以及由此派生的两个类
class SubView extends NavigationView
initialize: ->
# Setting the view's template property using the Underscore template method
_.merge @config, {
test:
string: "bla"
}
class IndexView extends NavigationView
...
如果在子视图的函数初始化配置变量中进行更改,则在IndexView的实例中也会进行更改
我像这样在主干内实例化我的对象。路由器类:
index: () ->
# Instantiates a new view which will render the header text to the page
new IndexView()
sub: () ->
new SubView()
我制作了一把小提琴来展示:
有什么办法吗
向您致意,hijolan您的问题是修改了它的第一个参数:
合并(对象[,源1,源2,…])
将源对象的可枚举属性合并到目标对象中
请注意,文档中提到的destination
实际上是指object
。merge
的目的是成为的深层版本,下划线文档明确说明了发生的情况:
扩展扩展(目的地,*来源)
将源对象中的所有属性复制到目标对象,并返回目标对象
您会注意到,lodash的参数名称也混淆了:
\分配(对象[,源1,源2,…])
将源
对象的自身可枚举属性分配给目标
对象
当他们说destination
时,他们的意思也是object
执行此操作时:
class NavigationView extends Backbone.View
config:
test:
string: "Test"
config
最终连接到NavigationView
的原型,因此NavigationView
及其子类将看到完全相同的config
对象。这意味着@config
是您的初始化中原型的config
:
_.merge @config, { test: { string1: "blub" } }
因此,\uuu.merge
将新值直接合并到原型的配置中,这使得更改在NavigationView
和它的所有子类中都可见。如果追溯继承,您会发现该上下文中的@config
来自NavigationView
,因此您的.merge
只是一种复杂的编写方式:
_.merge NavigationView::config, ...
问题的根源在于.extend
和.merge
修改了它们的第一个参数。摆脱此陷阱的方法是提供安全可写的目标对象:
@config = _.merge { }, @config, { test: { string1: 'blub' } }
# ----------------^^^
演示:您的问题是修改了它的第一个参数:
合并(对象[,源1,源2,…])
将源对象的可枚举属性合并到目标对象中
请注意,文档中提到的destination
实际上是指object
。merge
的目的是成为的深层版本,下划线文档明确说明了发生的情况:
扩展扩展(目的地,*来源)
将源对象中的所有属性复制到目标对象,并返回目标对象
您会注意到,lodash的参数名称也混淆了:
\分配(对象[,源1,源2,…])
将源
对象的自身可枚举属性分配给目标
对象
当他们说destination
时,他们的意思也是object
执行此操作时:
class NavigationView extends Backbone.View
config:
test:
string: "Test"
config
最终连接到NavigationView
的原型,因此NavigationView
及其子类将看到完全相同的config
对象。这意味着@config
是您的初始化中原型的config
:
_.merge @config, { test: { string1: "blub" } }
因此,\uuu.merge
将新值直接合并到原型的配置中,这使得更改在NavigationView
和它的所有子类中都可见。如果追溯继承,您会发现该上下文中的@config
来自NavigationView
,因此您的.merge
只是一种复杂的编写方式:
_.merge NavigationView::config, ...
问题的根源在于.extend
和.merge
修改了它们的第一个参数。摆脱此陷阱的方法是提供安全可写的目标对象:
@config = _.merge { }, @config, { test: { string1: 'blub' } }
# ----------------^^^
演示:您还有其他一些没有展示给我们的东西。您的代码与其他代码有何不同?您可能需要检查最后一个代码块中的缩进,正确的缩进在CoffeeScript中非常重要。嘿!你完全正确。。。我使用lodash中的uz.merge函数(如下划线.js)来合并初始化函数中的配置,以合并派生类中的父配置和配置。。。在将其替换为未合并的整个配置(仅用于测试目的)后,它工作正常!谢谢你的帮助…下面的提琴说明了问题:你还有别的事情没有告诉我们。您的代码与其他代码有何不同?您可能需要检查最后一个代码块中的缩进,正确的缩进在CoffeeScript中非常重要。嘿!你完全正确。。。我使用lodash中的uz.merge函数(如下划线.js)来合并初始化函数中的配置,以合并派生类中的父配置和配置。。。在将其替换为未合并的整个配置(仅用于测试目的)后,它工作正常!谢谢你的帮助…下面的小提琴显示了问题:嘿!非常感谢你!一方面是(简单的)解决方案,另一方面是完美而深刻的;)解释!!!!!