子视图事件回调是否优先?

时间:2016-12-19 21:00:34

标签: javascript backbone.js ecmascript-6

我有一些相关的主干观点:

首先:

App.Views.TreeGrowthBase = App.Views.TreeGrowthBase.extend({
  events: {
    'submit form': 'submitForm',
...

然后在同一个文件中:

submitForm: function(e) {
    e.preventDefault();

和app中的其他地方:

App.Views.WineTreeGrowthBase = App.Views.TreeGrowthBase.extend({
  submitForm(event) {
    event.preventDefault();

我的问题:在最后一段代码中......语法是什么:

submitForm(event) {
    event.preventDefault();

这是方法调用吗?定义方法?冒号在哪里?

哪一个优先?我想象子视图的submitForm方法定义发生了...如果是方法定义?

1 个答案:

答案 0 :(得分:4)

Method definition shorthand

submitForm(event) {
    event.preventDefault();

这是ES6中的方法定义简写(ECMAScript 2015)。

它相当于

submitForm: function submitForm(event) {
    event.preventDefault();
  

简写语法使用命名函数而不是匿名函数   函数(如foo: function() {})。可以调用命名函数   来自函数体(匿名函数不可能这样)   没有标识符可供参考)。有关详细信息,请参阅function

并在具有新功能的浏览器中工作(与IE不同)。

覆盖功能

在Backbone类的子级中重写的任何方法(extend函数的结果)优先于父函数。如果您想调用父函数,它仍然可能:

submitForm: function(event) {
    // Using the Backbone '__super__'
    ThisClass.__super__.submitForm.apply(this, arguments);
    // Or the JavaScript preferred way
    ParentClass.prototype.submitForm.apply(this, arguments);
    event.preventDefault();
}

这不是Backbone特有的。这是原型链的正常行为。 Backbone只是简单地将复杂性包含在一个简单的extend function中。

有关详细信息,请参阅此in-depth answer

不要使用this.constructor.__super__,因为它不能保证是实际的类,它可能是子类的构造函数,导致调用堆栈溢出 。赞成MyCurrentClass.__super__,它是明确的,并且可以解决潜在的延伸问题。