从javascript函数获取类方法

时间:2015-01-11 17:24:14

标签: javascript class

我们说我有一个函数,我需要检查它是否有某个名称的类方法。例如:

function Foo() {
    this.bar = function() {
        console.log("I am bar!");
    }
}

我想检查Foo类是否真的有bar方法。 我可以创建一个新的Foo实例,然后检查它,我只是想知道是否有更好的方法来做到这一点。

3 个答案:

答案 0 :(得分:6)

  

我可以创建一个新的Foo实例,然后检查它,我只是想知道是否有更好的方法来做到这一点。

不,如果在构造函数中添加了方法,就像在示例中一样。在创建实例之前无需检查。 (好吧,除了构造函数的源代码,如Pointy points out in a comment。)

如果在Foo.prototype上定义了它,那将是另一回事:

function Foo() {
}
Foo.prototype.bar = function() {
    console.log("I am bar!");
};

然后你可以通过查找Foo.prototype.bar进行检查。


旁注:打电话给他们"班级方法"可能会让人感到困惑。在基于类的OOP中,一个"类方法"通常是一个不是特定于实例的实例,而不是特定于实例但由类定义的实例。当然,JavaScript并没有基于类的OOP(它具有典型的OOP,即使在ES6中也增加了类似类的陷阱)。

答案 1 :(得分:1)

在你这样做之前没有方法:

var x = new Foo();

所以,你必须这样做,然后测试:

if (typeof x.bar === "function")

如果您的代码使用bar方法的原型,那么您可以直接测试原型而无需构造对象,但由于该方法仅在构造函数内创建,因此您必须按顺序运行构造函数看到它。

答案 2 :(得分:1)

TJ Crowder是正确的,因为您无法检查构造函数以检查“class”Foo是否具有某种方法。但是,您可以这样做:

function Foo() { /* Constructor */ }
Foo.prototype.bar = function() { /* Whatever you want */ }

然后进行测试,您只需执行typeof Foo.prototype.bar === "function"

这种方法有各种优点和缺点。 (见Use of 'prototype' vs. 'this' in JavaScript?)。如果您确实需要测试某个构造函数的实例是否会继承方法,则可以使用prototype方法。