当前位置: 首页 > 面试题库 >

是否可以从JavaScript的ECMAScript 6类继承旧类?

海鸣
2023-03-14
问题内容

在Node.js 4.2.1上运行以下代码时:

'use strict';



var util = require('util');



class MyClass {

  constructor(name) {

    this.name = name;

  }

}



function MyDerived() {

  MyClass.call(this, 'MyDerived');

}



util.inherits(MyDerived, MyClass);



var d = new MyDerived();

我收到以下错误:

constructor(name) {
         ^

TypeError: Class constructors cannot be invoked without 'new'

我想知道是否有可能从ECMAScript 6类继承旧式JavaScript“类”?而且,如果可能的话,怎么办?


问题答案:

选择class语法后,实际上并没有出路。

问题在于ES6中的继承是通过this使用from的返回值对关键字进行后期初始化来完成的,该返回值是from super()的构造函数,如with
new.call()在当前“未初始化”的子实例上“应用”()父构造函数的旧习惯
不再起作用

您仍然可以做的是求助于“寄生继承”-您必须显式构造实例,对其进行扩展,然后return再执行以下操作:

function MyDerived() {
  var derived = new MyClass('MyDerived');
  … // set up properties
  return derived;
}

使用时new MyClass,您将无法正确设置原型。为此,您将需要使用新的ES6
Reflect.construct函数,该函数将子类作为可选的第三个参数

function MyDerived() {
  var derived = Reflect.construct(MyClass, ['MyDerived'], new.target||MyDerived);
  … // set up properties
  return derived;
}

这具有额外的好处MyDerived并不需要与所谓的new多(只要你提供的任何MyDerived时候new.target为空)。



 类似资料:
  • 问题内容: 今天,我在采访中面临一个问题。是否可以在Singleton类上应用继承概念?我说过,由于构造函数是私有的,因此我们无法扩展该Singleton类。 他问我的下一件事是将继承应用于该Singleton类。因此,我将Singleton的构造函数作为受保护对象,认为孩子的构造函数也已受到保护。但是我错了,孩子可以有一个等于或大于该值的修饰符。 因此,我请他在这种情况下举一个真实的例子。他没能

  • 本文向大家介绍JavaScript中的继承之类继承,包括了JavaScript中的继承之类继承的使用技巧和注意事项,需要的朋友参考一下 继承简介       在JS中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多。在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。在JS中想要达到继承公用成员的目的,需要采取一系列措施。JS属于原型式继承,得益于这种灵活性,我们既可以

  • 本文向大家介绍JavaScript 类继承,包括了JavaScript 类继承的使用技巧和注意事项,需要的朋友参考一下 示例 继承的工作方式与其他面向对象的语言相同:在超类上定义的方法可在扩展子类中访问。 如果子类声明了自己的构造函数,则它必须先通过调用父构造函数,super()然后才能进行访问this。            

  • 问题内容: 接口是否从 Java中的类继承? 如果否,那么我们如何在接口实例上调用对象类的方法 问题答案: 接口是否从 Java中的类继承? 不,他们没有。而且,就这一点而言,也不存在所有接口都隐式继承的通用“根”接口(与类一样)。() 如果否,那么我们如何在接口实例上调用对象类的方法 接口为中的每个公共方法隐式声明一个方法。因此,该方法被隐式声明为接口中的成员(除非它已经从超级接口继承了该方法)

  • 问题内容: 在PHP / Java中,可以做到: 并且,Super类的所有公共/受保护的方法,属性,字段等都会自动成为Sub类的一部分,如有必要,可以重写这些类。 Javascript中的等效功能是什么? 问题答案: 我已经更改了现在的操作方式,我尝试避免使用构造函数和它们的属性,但是我从2010年起的旧答案仍然是最底层的。我现在更喜欢。适用于所有现代浏览器。 我应该注意,这通常比使用函数构造函数

  • 本文向大家介绍String类可以被继承吗?相关面试题,主要包含被问及String类可以被继承吗?时的应答技巧和注意事项,需要的朋友参考一下 String类在声明时使用final关键字修饰,被final关键字修饰的类无法被继承。 接下来我们可以看一下String类的源代码片段:   为什么Java语言的开发者,把String类定义为final的呢? 因为只有当字符串是不可变的,字符串池才有可能实现。