我在JS中有一组get函数,例如:
if
我希望能够在调用之前检查函数是否存在。 我试过了:
TypeError: Cannot read property '0' of undefined
但它始终为false,因为get UserName() {
return this.userModel.Name;
}
是一个字符串,if (this.UserName == 'function')...
返回'string'类型而不是'function'。
任何想法我怎么能做到这一点?
答案 0 :(得分:4)
检查UserName
是否存在(不调用getter)的一种简单方法是使用in
:
if ('UserName' in this) {
// this.UserName is defined
}
如果您需要更强的检查,直接访问getter函数,请使用Object.getOwnPropertyDescriptor
:
var userNameDesc = Object.getOwnPropertyDescriptor(this, 'UserName');
if (userNameDesc && userNameDesc.get) {
// this.UserName is definitely a getter and is defined
}
答案 1 :(得分:0)
您可以使用Object.getOwnPropertyDescriptor()
,它基本上返回与Object.defineProperty()
相同的数据结构,如下所示:
let descriptor = Object.getOwnPropertyDescriptor(this, "UserName");
if (descriptor && typeof descriptor.get === "function") {
// this.UserName is a getter function
}
或者,如果您想要更详细的信息,可以这样做:
let descriptor = Object.getOwnPropertyDescriptor(this, "UserName");
if (!descriptor) {
// property doesn't exist
} else if (typeof descriptor.get === "function") {
// this.UserName is a getter function
} else if (typeof descriptor.value === "function") {
// property directly contains a function (that is just a regular function)
} else {
// property exists, but it does not have a getter function and
// is not a regular function
}
您还可以测试描述符的许多其他属性,例如value
,set
,writable
,configurable
,enumerable
,如上所述{{3} }。