Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么主干模型在使用CoffeeScript类继承时不能正常工作_Javascript_Backbone.js_Coffeescript - Fatal编程技术网

Javascript 为什么主干模型在使用CoffeeScript类继承时不能正常工作

Javascript 为什么主干模型在使用CoffeeScript类继承时不能正常工作,javascript,backbone.js,coffeescript,Javascript,Backbone.js,Coffeescript,我看过几篇关于如何使用CoffeeScript的extends功能和主干的文章,但我无法让它工作。以下代码: Backbone = require 'Backbone' # The backbone way Base = Backbone.Model.extend ( initialize: -> ) Model = Base.extend ( initialize: -> console.log 'initialize called'

我看过几篇关于如何使用CoffeeScript的extends功能和主干的文章,但我无法让它工作。以下代码:

Backbone = require 'Backbone'

# The backbone way
Base = Backbone.Model.extend (
    initialize: ->
)

Model  = Base.extend (

    initialize: ->
        console.log 'initialize called'
        @on 'change:foo', ->
            console.log 'foo changed (Base)'

    defaults: (
        foo: 'bar'
    )
)

model = new Model()
model.set 'foo', 'baz'
console.log model.get 'foo'



# The coffeescript way with double ineritance
class Base2 extends Backbone.Model
    constructor: ->

class Model2 extends Base2

    constructor: ->
        console.log 'constructor called (Base2)'
        @on 'change:foo', ->
            console.log 'foo changed (Base2)'

    defaults: (
        foo: 'bar'
    )

model2 = new Model2 (foo: 'bar')

model2.set 'foo', 'baz2'
console.log model2.get 'foo'
抛出:

  % coffee index.coffee                                                                                                                                                                            
initialize called
foo changed (Base)
baz
constructor called (Base2)
TypeError: Cannot read property 'foo' of undefined
  at Model2._.extend.set 

您也可以在这里使用它

您的问题是,您正在通过指定自己的
构造函数来替换主干的构造函数。主干网需要使用自己的构造函数来设置所有主干网内部构件,您的类构造函数代码应该位于
初始化
中,就像您使用主干网的
扩展
函数而不是CoffeeScript的
扩展
关键字时一样:

class Base2 extends Backbone.Model
    initialize: ->

class Model2 extends Base2

    initialize: ->
        console.log 'initialize called (Base2)'
        @on 'change:foo', ->
            console.log 'foo changed (Base2)'

    defaults: (
        foo: 'bar'
    )

更新的演示:

我们已经对它进行了更多的研究,当我使用initialize(不是构造函数)时,它确实可以工作,但我仍然觉得奇怪,我必须实现一个initialize函数才能使模型工作。在我看来,使用默认的u.extends将更加可靠。@mrwooster您不必实现初始化函数,只需不重写构造函数即可。无需定义初始化即可正常工作。我怀疑如果您使用\覆盖构造函数,您也会看到同样的问题。extend@mrwooster不编写自己的构造函数在框架中很常见,经常发生。@ivarni-是的,我明白了,但我的问题更多的是,当构造函数看起来是两个独立的函数时,为什么构造函数会干扰初始化函数…@mrwooster它们是两个独立的函数。initialize用于连接和设置内容,构造函数用于框架设置自己的内容。重写构造函数时,必须调用原始构造函数或对其进行反向工程。正如您所发现的,覆盖它并将其留空将破坏一切。这是您正在重写的默认构造函数所做的:。请注意,它创建了
attributes
对象,当您的代码在
model2.set()爆炸时,该对象丢失了