【问题标题】:Check if a value is a class? [duplicate]检查一个值是否是一个类? [复制]
【发布时间】:2015-08-26 19:49:01
【问题描述】:

既然类在 ES6+ 中,我希望能够检查一个值是常规函数还是类定义,例如:

console.log(isClass(class A {}), 'should be true')
console.log(isClass(class B {}), 'should be true')
console.log(isClass(function () {}), 'should be false')

但是,我似乎找不到任何方法来解决这个问题。我曾考虑过使用Object.getOwnPropertyNames(class A {})(class A {}).__proto__ === Function.prototype,但它们也为函数返回true

到目前为止,我想出的最好的是:

function isClass (thing) {
    return typeof thing === 'function' && Object.getOwnPropertyNames(thing).indexOf('arguments') === -1
}

但这似乎并不那么强大。

【问题讨论】:

标签: javascript class


【解决方案1】:

查看Babel生成的编译代码,我认为没有办法判断函数是否用作类。回到过去,JavaScript 没有类,每个构造函数都只是一个函数。今天的 JavaScript 类关键字并没有引入“类”的新概念,而是一种语法糖。

ES6 代码:

// ES6
class A{}

Babel生成的ES5:

// ES5
"use strict";

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var A = function A() {
    _classCallCheck(this, A);
};

当然,如果你喜欢编码约定,你可以解析函数(类),并检查它的名称是否以大写字母开头。

function isClass(fn) {
    return typeof fn === 'function' && /^(class|function [A-Z])/.test(fn);
}

编辑:

已经支持class关键字的浏览器可以在解析时使用它。否则,您将被大写字母 1 卡住。

【讨论】:

猜你喜欢
  • 2020-04-24
  • 1970-01-01
  • 2015-09-14
  • 2014-09-12
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多