Inheritance CoffesScript中的继承不';由于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

我在CoffeeScript中使用Backbone.js编程,在继承lodash和合并函数时遇到问题

有一个超类

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)来合并初始化函数中的配置,以合并派生类中的父配置和配置。。。在将其替换为未合并的整个配置(仅用于测试目的)后,它工作正常!谢谢你的帮助…下面的小提琴显示了问题:嘿!非常感谢你!一方面是(简单的)解决方案,另一方面是完美而深刻的;)解释!!!!!