17

我一直在浏览 Ember 文档,发现_super在覆盖时调用方法的位置不一致init

这是最常见的,也是我迄今为止一直在使用的

var Foo = Em.Object.extend({
    init: function(){
        this._super();
        // ... my stuff ...
    }
});

昨晚我正在阅读这篇文章并看到一个这样做的例子

var Bar = Em.Object.extend({
    init: function(){
        // ... my stuff ...
        return this._super();
    }
});

它实际上是Ember.ContainerView代码片段中的一个。

谁能解释一下?我的代码强迫症正在发作,直到我知道我才能继续前进。

4

1 回答 1

14

在链接的文档中

 init: function() {
    var childViews = this.get('childViews');
    var descriptionView = App.DescriptionView.create();
    childViews.pushObject(descriptionView);
    this.addButton();
    return this._super();
  },

_super()在创建 descriptionView 并将其推送到childViews数组后调用。

那是因为超类init实现将采用 childViews 数组并对其进行处理。如果您_super在将其添加到数组之前调用descriptionView,它不会被任何init处理......

我在推断,但这就是它在 Sproutcore 中的工作方式,Ember 就是从它派生的,所以我认为它可能是一样的。

于 2012-06-01T15:30:15.840 回答