KeiferGu的博客

在Javascript中获取class的类型名的方法

在Javascript中获取class的类型名主要有以下几种方法:

  1. Function.name
    在JS中class的类型名是由constructor的函数名决定的,那么我们可以直接调用constructor.name获取到类型名,这个方法不管是对通过new新建的实例还是class对象都能适用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Polygon {
    constructor(){
    this.x = 1;
    }
    say() {
    console.log(this.constructor.name); //Polygon
    }
    }
    let p = new Polygon();
    console.log(p.constructor.name); //Polygon
  2. class.name
    由于class本质只是函数的一层包装,也就是跟我们以前使用构造函数写类本质是一样的,所以我们可以直接使用class.name获取到类型名,但是对使用new新建的实例没用:

    1
    2
    3
    4
    5
    class Polygon {
    constructor(){
    }
    }
    console.log(Polygon.name); //Polygon
  3. toString与正则表达式
    因为现在Function.name还不是正式的标准,MDN不推荐在生产环境使用,详见Function.name,所以在较低的版本最好的办法是使用Function.toString(),然后使用正则表达式匹配在function后面的字符。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Polygon() {
    this.x = 1;
    }
    class Circle {
    constructor() {
    }
    }
    var nameFromToStringRegex = /^function\s?([^\s(]*)/;
    var funName = Polygon.toString().match(nameFromToStringRegex)[1];
    console.log(funName); //Polygon
    var className = Circle.constructor.toString().match(nameFromToStringRegex)[1];
    console.log(className);
  4. 通用的方法
    适用与functionclass的类名,函数名的获取。
    摘自stackoverflow

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /**
    * Gets the classname of an object or function if it can. Otherwise returns the provided default.
    *
    * Getting the name of a function is not a standard feature, so while this will work in many
    * cases, it should not be relied upon except for informational messages (e.g. logging and Error
    * messages).
    *
    * @private
    */
    function className(object, defaultName) {
    var nameFromToStringRegex = /^function\s?([^\s(]*)/;
    var result = "";
    if (typeof object === 'function') {
    result = object.name || object.toString().match(nameFromToStringRegex)[1];
    } else if (typeof object.constructor === 'function') {
    result = className(object.constructor, defaultName);
    }
    return result || defaultName;
    }