Как переопределить функцию Backbone.Router.execute в ее дочернем классе coffeescript? - PullRequest
0 голосов
/ 31 мая 2019

У меня есть класс, который расширяет Backbone.Router, используя ключевое слово extends в coffeescript.Как я могу переопределить метод Backbone.Router.execute в моем классе?

Я попытался добавить в свой дочерний класс команду 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, но каким-то образом не могу переопределить метод execute.Что я тут не так делаю?

1 Ответ

0 голосов
/ 31 мая 2019

Похоже, вы просто не можете смешивать магистральные объекты и классы ES6.

Вот пост , который объясняет это очень подробно .

получается, что классы ES6 не поддерживают добавление свойств непосредственно к экземпляру класса, только функции / методы. Это имеет смысл, когда вы понимаете, что на самом деле происходит. В случае наследования JavaScript свойства обычно задаются для экземпляра при его создании, а методы - для объекта-прототипа и совместно используются каждым экземпляром. Если свойства добавляются непосредственно к прототипу, они также становятся общими для каждого экземпляра, что создает проблемы, если свойство является объектом с изменяемым состоянием, таким как массив


Вам придется придерживаться магистрального способа использования Object.extends(). Вот пример для вашего кода в coffeescript:

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
...