在ES6中获取超类名称

时间:2016-01-03 01:47:23

标签: javascript ecmascript-6

我有一个类,另一个类扩展了该类。

class Shape {
  constructor() {
    return this;
  }
}
class Circle extends Shape {
  constructor() {
    super();
    return this;
  }
}
let foo = new Circle();

我可以通过

获得foo的课程
let className = foo.constructor.name 
// returns string 'Circle'

是否有可能以类似的方式获取foo的超类('Shape')的名称?

4 个答案:

答案 0 :(得分:11)

Object.getPrototypeOf(Object.getPrototypeOf(foo)).constructor.name;

答案 1 :(得分:5)

知道了:

let superClassName = foo.__proto__.__proto__.constructor.name
// return Shape

编辑:这将返回父类,该类不一定是最初扩展的Circle类。在我的用例中它们是相同的,但是这里对'超类'的含义有微妙的含糊不清。

答案 2 :(得分:1)

您可以定义以下类:

class MyObject
{
  extends(className)
  {
    let next = Object.getPrototypeOf(this);

    while(next.constructor.name !== "Object")
    {
      if(next.constructor.name === className)
        return true;
      next = Object.getPrototypeOf(next);
    }
    return false;
  }
}

让您定义的每个类都可以扩展该类。

现在,如果要检查对象是否扩展了特定的类,则可以调用它的extends方法并将父类的名称作为参数传递。 extend方法将沿整个继承树进行,并检查您的对象是否扩展了给定的类,不仅检查了他的父母,还检查了他的祖父母和祖父母等等。

示例:

class MyObject
{
  extends(className)
  {
    let next = Object.getPrototypeOf(this);

    while(next.constructor.name !== "Object")
    {
      if(next.constructor.name === className)
        return true;
      next = Object.getPrototypeOf(next);
    }
    return false;
  }
}

class Vehicle extends MyObject
{
}

class Car extends Vehicle
{
}

class Bmw extends Car
{
}

let car = new Car();
let bmw = new Bmw();

console.log("bmw extends Bmw: " + bmw.extends("Bmw"));
console.log("bmw extends Car: " + bmw.extends("Car"));
console.log("bmw extends Vehicle: " + bmw.extends("Vehicle"));
console.log("car extends Car: " + car.extends("Car"));
console.log("car extends Bmw: " + car.extends("Bmw"));

答案 3 :(得分:-1)

你的终极超类总是对象,所以没有必要尝试推导它。您需要使用' is'来探测相关实例是否是其他内容的实例。关键词。我是从Actionscript-3的角度来写这个,所以我不确定ES-6中的语法是什么,但它应该是" if(这是Shape)&# 34 ;.如果有问题的实例扩展了您正在讨论的类,那将返回true,否则返回false。

然而,您要问的是Shape从标准库或标准Object分支出来的地方,编译器或运行时无法解决这个问题。从理论上讲,如果ECMA语言可以为给定的类提供向后的继承数组,那将是非常好的,但AFAIK不是也从未成为一个特性。如果没有完整的继承链,您需要知道您正在寻找的超类,或者您无法以任何逻辑方式推导它。

相关问题