从ES6的孩子那里获取父类名?

Swa*_*don 23 javascript ecmascript-6

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

'use strict';

class Parent {

}

class Child extends Parent {

}

var instance = new Child();
console.log(instance.constructor.name);
Run Code Online (Sandbox Code Playgroud)

可能吗 ?

谢谢 !

Ber*_*rgi 37

ES6类相互继承.所以当instance.constructor引用时Child,则可以使用Object.getPrototypeOf(instance.constructor)获取Parent,然后访问.name:

Object.getPrototypeOf(instance.constructor).name == "Parent";
Run Code Online (Sandbox Code Playgroud)

当然,完整的ES6合规性和非缩小代码是必不可少的.你不应该依赖代码中的函数名.

  • 在您的代码被丑化时,请小心使用`name`. (4认同)

log*_*yth 6

你可以在技术上做到

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

// parentProto === Parent.prototype
var parentProto = Object.getPrototypeOf(instanceProto);
console.log(parentProto.constructor.name);
Run Code Online (Sandbox Code Playgroud)

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


Res*_*ign 6

这里有一些有趣的事情:

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.
Run Code Online (Sandbox Code Playgroud)

  • 你的回答启发我写了一个[`ancestors`函数](https://gist.github.com/ceving/2fa45caa47858ff7c639147542d71f9f)。 (2认同)