我们说我有一个函数,我需要检查它是否有某个名称的类方法。例如:
function Foo() {
this.bar = function() {
console.log("I am bar!");
}
}
我想检查Foo类是否真的有bar方法。 我可以创建一个新的Foo实例,然后检查它,我只是想知道是否有更好的方法来做到这一点。
答案 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
方法。