使用 ES6 从孩子那里获取父类名称?

IT技术 javascript ecmascript-6
2021-03-10 10:37:43

我想获取父类名称 ( Parent),但我只能使用此代码 ( Child)检索子类名称...

'use strict';

class Parent {

}

class Child extends Parent {

}

var instance = new Child();
console.log(instance.constructor.name);

是否可以 ?

谢谢 !

5个回答

ES6 类相互继承。所以当instance.constructor指的是Child,那么你可以使用Object.getPrototypeOf(instance.constructor)来获取Parent,然后访问.name

Object.getPrototypeOf(instance.constructor).name // == "Parent"

当然,完整的 ES6 合规性和非压缩代码是必要的。你永远不应该依赖代码中的函数名。

来这里发这个:)。例如,如果cextends bextends a:) ,你也可以在树上更上一层楼。另外,好消息,有一个(非常基本的)ES6 小提琴:es6fiddle.net
2021-04-21 10:37:43
你是对的,如果需要比较,直接比较类引用是正确的方法。这是我应该写的:Object.getPrototypeOf(instance.constructor) === Parent;
2021-05-02 10:37:43
@rpatel 我从来没有打算以任何方式认可在这里使用比较运算符,OP 询问如何访问该名称。如果缩小器确实对不同范围内的不同类使用相同的名称,则您比较名称的方法仍然容易受到缩小的影响。如果您必须比较某些内容,只需直接比较类引用即可。
2021-05-09 10:37:43
name当你的代码被丑化时要小心使用
2021-05-18 10:37:43

这里有一些有趣的事情:

class J {}
    
class K extends J {}

class L extends K {}

function getBaseClass(targetClass){
  if(targetClass instanceof Function){
    let baseClass = targetClass;

    while (baseClass){
      const newBaseClass = Object.getPrototypeOf(baseClass);

      if(newBaseClass && newBaseClass !== Object && newBaseClass.name){
        baseClass = newBaseClass;
      }else{
        break;
      }
    }

    return baseClass;
  }
}

console.log(getBaseClass(L)); // Will return J.

很好,但是这段时间有什么意义.. 获取该实例的最后一个副本?
2021-04-21 10:37:43
@1-14x0r 如果你想混合一个从基类继承一些东西的类,这是必要的。
2021-05-01 10:37:43
你的回答激励我写一个ancestors函数
2021-05-06 10:37:43

你可以在技术上做到

// instanceProto === Child.prototype
var instanceProto = Object.getPrototypeOf(instance);

// parentProto === Parent.prototype
var parentProto = Object.getPrototypeOf(instanceProto);
console.log(parentProto.constructor.name);

请记住,这些名称可能都被压缩器破坏了。

感谢您的回答,但正如@Maverick 所说,我仍然需要父类名来访问相同的信息......另外,Node.js 项目,所以缩小不是问题
2021-04-22 10:37:43
你已经排除了从孩子到父母的任何步骤?我对这如何回答问题感到困惑(如果确实如此)?
2021-05-07 10:37:43
废话,只是一个错字。第二行应该是instanceProto.
2021-05-17 10:37:43
哦对不起 !谢谢你的回答!
2021-05-19 10:37:43

原型属性:

Child['__proto__'].name

这里的例子:https : //stackblitz.com/edit/typescript-s5brk9

另一种简单的解决方案:

class Foo {}

class Bar extends Foo{}

Object.getPrototypeOf(Bar) === Foo // true

Bar.__proto__ === Foo // true

console.log(Bar.__proto__.name) // Foo