确定是否从继承的类中调用了super()

迈克尔·K

有没有一种方法可以确定继承类是否费心super()在JavaScript中调用

function A() {

  A.prototype.isInitialized = function() {
      // what can be checked to see if B bothered to called super()
  }  
}

class B extends A {
   //constructor() {
   // didn't call super()
   //}
}

假设B没有自己的构造函数。它是否仅使用A的构造函数,从而在默认情况下有效地调用了super?

亭子

如果不同时调用A的构造函数,则无法创建B的实例(除非您不使用将为您创建的对象,而是返回另一个对象,请参见下文)。

如果您没有为类B指定构造函数,那么将为您创建一个看起来像这样的构造函数(在您的情况下,没有参数):

constructor(...args) {
    super(...args);
}

如果为B显式创建一个构造函数,并且不返回任何对象,则必须super在其中调用它,否则无法创建B的实例以下将产生错误:

function A() {
    console.log('hi');
}

class B extends A { 
    constructor() {
        // no call to super is made
    }
}

var b = new B(); // Reference Error: `this` is not defined

使用退货

但是,如果您忽略了将为您创建的对象(上下文,this),不引用this并返回另一个对象,则不会调用父级的构造函数:

function A() {
  console.log('hi');
  this.isInitialised = true;
}

class B extends A { 
  constructor() {
    return Object.create(B.prototype);
  }
}

var b = new B();
console.log(b instanceof B, b instanceof A, b.isInitialised); // true, true, undefined

在这里,我们Object.create用来创建B的原型的实例,它是A的实例,但是不会执行A的构造函数。查看输出以解释结果。

结论

因此,无论您是否在B上定义构造函数,在所有不返回对象的有效情况下,都会调用A的构造函数

returnB的构造函数中使用,可以创建一个对象,该对象仍然是A的实例,但是不调用其构造函数。您可以在A实例中使用属性来指示构造函数是否运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

确定是否在使用Perl的测试中调用了函数

来自分类Dev

R:我们能否确定是否从RStudio中调用了函数?

来自分类Dev

确定是否启用了小部件

来自分类Dev

如何确定是否启用了沙箱

来自分类Dev

确定是否首先从查询VBA中调用函数

来自分类Dev

如何知道是否通过super调用了类构造函数?

来自分类Dev

确定是否从with语句调用

来自分类Dev

如何确定是否存在类方法

来自分类Dev

如何确定是否启用了PHP OPcache?

来自分类Dev

确定是否使用了MATLAB GUI edittextbox

来自分类Dev

BASH:确定是否从虚拟机(Ubuntu)或W10 bash应用程序调用了脚本?

来自分类Dev

从继承类的模块定义的方法中调用super

来自分类Dev

从继承类的模块定义的方法中调用super

来自分类Dev

R参考类-如何确定您是否在继承的方法中?

来自分类Dev

确定是否曾经在Swift中对`registerUserNotificationSettings`进行过调用

来自分类Dev

无法使用super调用继承的类函数

来自分类Dev

VIM:确定是否从可视块模式调用函数

来自分类Dev

确定是否通过NodeJS模块直接调用脚本

来自分类Dev

确定是否存在具有类的元素的更快方法?

来自分类Dev

PHPUnit测试是否调用了类方法

来自分类Dev

以编程方式确定是否启用了Windows 8安全启动

来自分类Dev

如何确定是否在AMD A6上启用了NX?

来自分类Dev

以编程方式确定是否在浏览器中启用了弹出窗口阻止程序,而无需打开新选项卡

来自分类Dev

是否可以在编译时验证是否在Kotlin中为Factory类调用了所需的函数?

来自分类Dev

使用node.js确定是否在git目录中

来自分类Dev

如何确定是否在C中映射了内存页

来自分类Dev

如何确定是否在Chrome中以全屏模式播放视频

来自分类Dev

在libgdx中确定是否从平底锅中逃脱

来自分类Dev

如何确定是否在Ruby中传递了可选参数

Related 相关文章

  1. 1

    确定是否在使用Perl的测试中调用了函数

  2. 2

    R:我们能否确定是否从RStudio中调用了函数?

  3. 3

    确定是否启用了小部件

  4. 4

    如何确定是否启用了沙箱

  5. 5

    确定是否首先从查询VBA中调用函数

  6. 6

    如何知道是否通过super调用了类构造函数?

  7. 7

    确定是否从with语句调用

  8. 8

    如何确定是否存在类方法

  9. 9

    如何确定是否启用了PHP OPcache?

  10. 10

    确定是否使用了MATLAB GUI edittextbox

  11. 11

    BASH:确定是否从虚拟机(Ubuntu)或W10 bash应用程序调用了脚本?

  12. 12

    从继承类的模块定义的方法中调用super

  13. 13

    从继承类的模块定义的方法中调用super

  14. 14

    R参考类-如何确定您是否在继承的方法中?

  15. 15

    确定是否曾经在Swift中对`registerUserNotificationSettings`进行过调用

  16. 16

    无法使用super调用继承的类函数

  17. 17

    VIM:确定是否从可视块模式调用函数

  18. 18

    确定是否通过NodeJS模块直接调用脚本

  19. 19

    确定是否存在具有类的元素的更快方法?

  20. 20

    PHPUnit测试是否调用了类方法

  21. 21

    以编程方式确定是否启用了Windows 8安全启动

  22. 22

    如何确定是否在AMD A6上启用了NX?

  23. 23

    以编程方式确定是否在浏览器中启用了弹出窗口阻止程序,而无需打开新选项卡

  24. 24

    是否可以在编译时验证是否在Kotlin中为Factory类调用了所需的函数?

  25. 25

    使用node.js确定是否在git目录中

  26. 26

    如何确定是否在C中映射了内存页

  27. 27

    如何确定是否在Chrome中以全屏模式播放视频

  28. 28

    在libgdx中确定是否从平底锅中逃脱

  29. 29

    如何确定是否在Ruby中传递了可选参数

热门标签

归档