如何在访问之前确定是否定义了getter?

时间:2017-10-12 23:22:47

标签: ecmascript-6

我在JS中有一组get函数,例如:

if

我希望能够在调用之前检查函数是否存在。 我试过了:

TypeError: Cannot read property '0' of undefined

但它始终为false,因为get UserName() { return this.userModel.Name; } 是一个字符串,if (this.UserName == 'function')... 返回'string'类型而不是'function'。

任何想法我怎么能做到这一点?

2 个答案:

答案 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
}

您还可以测试描述符的许多其他属性,例如valuesetwritableconfigurableenumerable,如上所述{{3} }。