如何使用父对象上下文创建_super()?

时间:2012-10-09 08:39:45

标签: ember.js

App.CurtainView = Ember.View.extend
  name: "CurtainView"
  getName: ->
    console.log @get("name")

App.ButtonView = App.CurtainView.extend
  name: "ButtonView"
  getName: ->
    # Do something
    @_super()

在控制台上返回:

ButtonView

......但我希望:

CurtainView

我想这是一个上下文问题 - 如何使用父对象上下文创建_super()?

1 个答案:

答案 0 :(得分:2)

我没有完全实现你的目标。这种行为与您对Ruby语言的期望相同,但实际上与您使用Java 获得的行为不同(假设您将重新定义name子类中的Button属性) ...

事实上,您必须了解Ember的对象模型的实现方式,以便更好地理解您获得的行为:

App = Ember.Application.create();

App.CurtainView = Ember.View.extend({
  name: "CurtainView",
  getName: function() {
    console.log(this.get("name"));
  }
});

App.ButtonView = App.CurtainView.extend({
  name: "ButtonView",
  getName: function() {
    this._super();
  }
});

var c = App.CurtainView.create(),
    b = App.ButtonView.create();

console.log(c.getName.toString());
console.log(b.getName.toString());

c.getName();
b.getName();
b.getName.apply(c);

默认情况下,_super调用适用于调用当前函数的对象。

您可以通过getNameapply调用call并传递适当的目标来覆盖此默认行为。但这对我来说似乎很奇怪......

JSFiddle here