【问题标题】:How do I override Backbone.Router.execute function in its coffeescript child class?如何在其咖啡脚本子类中覆盖 Backbone.Router.execute 函数?
【发布时间】:2019-10-16 18:38:18
【问题描述】:

我有一个类在 Coffeescript 中使用 extends 关键字扩展 Backbone.Router。如何在我的类中覆盖 Backbone.Router.execute 方法?

我尝试在我的子类中添加一个具有相同方法签名的执行,但它仍在调用父类方法而不是我的自定义方法。

jQuery ->
  class MyRouter extends Backbone.Router

    routes:
      "path/:id"          : "myFunction"

    execute: (callback, args, name) ->
      console.log('hello')
      console.log(args)
      # do stuff

      args.push(parseQueryString(args.pop()));
      if callback
         callback.apply(@, args);

   myFunction: (id) ->
     # do stuff

我想在调用 myFunction 之前对 args 添加一些检查,但不知何故无法覆盖执行方法。我在这里做错了什么?

【问题讨论】:

  • 您能说明您是如何实例化MyRouter 并调用execute 方法的吗?
  • @caffeinated.tech 正常实例化customRouter = new MyRouter。我们不需要调用 execute 方法,因为主干正在处理 backbonejs.org/#Router-execute

标签: backbone.js coffeescript


【解决方案1】:

看起来你根本不能混合主干的对象和 ES6 类。

这是post which explains it in great detail

事实证明,ES6 类不支持直接向类实例添加属性,只支持函数/方法。当您了解实际发生的情况时,这是有道理的。使用 JavaScript 继承,属性通常意味着在创建实例时对其进行设置,而在原型对象上设置方法并在每个实例之间共享。如果将属性直接添加到原型中,它们也会在每个实例之间共享,如果属性是具有可变状态的对象(如数组),则会产生问题


您将不得不坚持使用Object.extends() 的主要方式。这是您在咖啡脚本中的代码示例:

MyRouter = Backbone.Router.extend        
    routes:
      "path/:id"          : "myFunction"

    execute: (callback, args, name) ->
      console.log('hello')
      console.log(args)
      # do stuff

      args.push(parseQueryString(args.pop()));
      if callback
         callback.apply(@, args);

   myFunction: (id) ->
     # do stuff

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 2013-06-15
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多