【问题标题】:How & Why to use SUPER in code?如何以及为什么在代码中使用 SUPER?
【发布时间】:2012-02-04 14:52:22
【问题描述】:

我与一些高级 JavaScript 人员一起工作,他们在代码中使用了 SUPER 关键字。我承认,我不太了解如何以及为什么可以并且会使用它。

有人可以指导我或告诉我如何精通它的用法和推理吗?

这里有一些例子:

openup: function( $super ) {
    $super();
    this.shop.enable_access();
}



addLeft: function( data ) {
    var cell = Element('td');
    if ( data.item_data ) {
        var item = new SRIL(data.item_data);
        item.attach(cell);
        item.show();
    }

    return cell;

}

var SRIL = Class.create(Module, {
initialize: function( $super, data ) {
    $super({ dom: 'show_line' });
    this.data = data;
    if ( data.Type[0] == 'Car' ) {
        //some code
    }
    else {
        // some code
    }
}

});

【问题讨论】:

  • 您是指SUPER 还是super?案件很重要。
  • $super 改变了一些东西——它不是关键字,而只是一个变量。
  • 在我看来,这段代码是基于 Prototype.js 框架构建的:prototypejs.org/learn/class-inheritance

标签: javascript keyword superclass super


【解决方案1】:

JavaScript 没有这样的东西。

更新:您应该在此处查看正在使用的库的文档。这是库功能,而不是语言功能。

【讨论】:

  • 它是一个reserved future keyword,所以它确实“拥有”它。不过,我不知道是否有任何实现使用它。
  • 难道不能在JS中创建类并作为SUPER类继承吗?想我在coffeescript中看到了类似的东西。
  • @Alex M:这是可能的,但前提是您自己使用原型实现它,而不是使用 JavaScript 本身。这个问题对我来说似乎是一个 Java JavaScript 问题。
  • @copy:你的意思是原型继承与“原型”?为什么说它不是 JavaScript?原型继承是 JavaScript 管理对象继承的方式。
  • @FelixKling:我是说 JavaScript 本身 没有重用构造函数的功能(如 Java 的 super)。并且不可能使用关键字super 创建它,因为它是保留的。所以我猜这是原始海报的错误。
【解决方案2】:

由于 Javascript 没有经典继承,而是根据原型/功能模型进行结构化,因此开发人员已经进行了各种尝试来重新创建经典模型。 super 是其中一种策略的一部分。它解决的特定问题是子对象具有与父对象相同的方法(即使它只是构造函数)的情况。如果不创建 super 作为父方法的别名,访问这些方法会变得有些麻烦(并且在某些情况下是不可能的)。

John Resig 有一个wrapper 很好地展示了这一点。注意他在第一个例子中使用 _super() 来调用父对象的 dance 方法。

【讨论】:

  • 我添加了一些我在代码中看到的示例,供您参考其用法。
  • 在这些情况下,开发人员可能使用$super 直接引用父方法。换句话说,我假设$super 在第一个示例中引用了称为open_up 的父方法,在第二个示例中引用了父方法initialize
猜你喜欢
  • 1970-01-01
  • 2017-12-03
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2019-05-24
  • 1970-01-01
相关资源
最近更新 更多