我有一个类,另一个类扩展了该类。
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')的名称?
答案 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不是也从未成为一个特性。如果没有完整的继承链,您需要知道您正在寻找的超类,或者您无法以任何逻辑方式推导它。