【问题标题】:How to know if a function is a class or a function如何知道函数是类还是函数
【发布时间】:2015-05-30 14:39:42
【问题描述】:

我实际上是在尝试区分(在我的代码中)函数和类。

我需要知道,在一个简单的console.log中,我的函数的参数是一个类还是一个简单的函数。

我实际上是在讨论类,而不是对象,而是真正的类。

喜欢:

function(item){
    if(isClass(item)){
        console.log('it s a class !');
    }else{
        if(isFunc(item)){
            console.log('it s a function !');
         }
    }
}

编辑:angular 2 能够区分其注入器容器类中的函数和类

【问题讨论】:

  • 定义“真的是一个类。
  • JS中没有所谓的“类”这个概念。不过,你可以用FunctionPrototype来模拟一个“类”,但它实际上是一个函数。

标签: javascript


【解决方案1】:

JavaScript 中没有任何类。尽管可以使用 new 关键字来实例化函数。

你可以用instanceof检查某事是否是一个函数:

var a = function() {};

a instanceof Function; // true

实例化函数将是该特定函数的实例:

var b = new a();

b instanceof Function; // false
b instanceof a; // true

【讨论】:

    【解决方案2】:

    Javascript 中没有类*。相反,在 new 关键字的帮助下,JavaScript 中的函数可以像构造函数一样作用。 (constructor 模式)

    JavaScript 中的对象直接继承自其他对象,因此我们不需要类。我们所需要的只是一种创建和扩展对象的方法。

    您可以使用jQuery.isFunction() 来检查传递给isFunction() 的参数是否是Javascript 函数对象。

    来自documentation

    jQuery.isFunction()

    说明:判断传递的参数是否为 JavaScript 函数对象。

    编辑: 正如user2867288 正确指出的那样,Javascript 没有类的声明需要一点点的理解。

    阅读这些文章以了解有关 ECMAScript 6 标准的更多信息:

    【讨论】:

    • 实际上在 Javascript, ECMAScript 6 中有类。
    • @user2867288,您能否详细说明您的观点或指出正确的方向?
    • 这是 ECMAScript 标准的新内容。这意味着目前将严重缺乏浏览器支持。 2ality.com/2015/02/es6-classes-final.html
    【解决方案3】:

    构造函数(“类”)只是函数。它们没有什么区别。

    但是,它们的用法完全不同。类通常在其原型上有方法,甚至可能还有其他属性。实际上,这就是您可以区分它们的方法。1
    绑定函数和使用箭头符号 (ES6) 构造的函数甚至根本没有原型。

    function isFunc(fn) {
        return typeof fn == "function" && (!fn.prototype || !Object.keys(fn.prototype).length);
    }
    

    1:未检测到不使用原型继承的非典型类

    【讨论】:

    • 这个想法用在Bluebird library
    • 所以,没有可靠的方法来区分类(虽然它是伪装的函数)和函数,对吧?
    • 是的,没有可靠的方法。我会说“因为它是(伪装成)一个函数”:-)
    • 甚至 ES6 类都没有——尽管有讨论 Reflect.isCallable 是否应该为它们返回 false
    • 我正在通过规范查找是否有任何暴露实际类型的内部插槽,但我不能:'(
    猜你喜欢
    • 1970-01-01
    • 2014-08-24
    • 2021-12-13
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2013-09-03
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多