【问题标题】:How to determine if object is a class or a function in Javascript [duplicate]如何确定对象是Javascript中的类还是函数[重复]
【发布时间】:2017-06-13 22:07:49
【问题描述】:

假设我有这两个:

class Foo {}
const Bar = function() {}

// Then somewhere I have an object:
const variable = Foo;
// OR
const variable = Bar;

我如何知道variable 是函数还是类?这里的问题是typeof Footypeof Bar 都返回function

【问题讨论】:

  • 对象就是对象 ;-)
  • @johnSmith :( :D. 所以没有办法?!
  • @johnSmith 但typeof Footypeof Bar 都会返回function ...
  • javascript 中没有“类”。有一个类语法。所有的原生函数都是构造函数,没有办法区分它们。但是,在最新版本的 ECMAScript 中,使用 Class 语法创建的构造函数如果作为函数调用会抛出错误,所以就是这样。
  • @EmileBergeron 是的,这就是我问的原因

标签: javascript ecmascript-6


【解决方案1】:

这个问题是意料之中的,因为最近添加的新语法糖引起的混乱。

来自MDN doc on Classes

ECMAScript 2015 中引入的 JavaScript 类主要是 JavaScript 现有的基于原型的语法糖 遗产。类语法引入了新的面向对象 继承模型到 JavaScript。
[...]
类实际上是“特殊的functions”,正如您可以定义的那样 function expressionsfunction declarations,类语法有 两个组件:class expressionsclass declarations

MDN doc on class expressions 显示了您对 typeof 的了解:

'use strict';
var Foo = class {}; // constructor property is optional
var Foo = class {}; // Re-declaration is allowed

typeof Foo; //returns "function"
typeof class {}; //returns "function"

Foo instanceof Object; // true
Foo instanceof Function; // true
class Foo {}; // Throws TypeError, doesn't allow re-declaration

但与类表达式不同,class declaration 不允许 现有的类要再次声明,如果 尝试过。
[...]
类声明不会被提升(与 function declarations 不同)。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2016-05-13
    • 2014-02-14
    • 2017-02-19
    相关资源
    最近更新 更多