确定JavaScript属性是否定义了getter或setter?

dev*_*os1 38 javascript properties getter-setter

是否有可能,给定一个对象和属性名称来确定该属性是使用getter还是setter定义的,还是完全透明的?我只想定义一个getter/setter,如果没有在属性上定义的那个.

我需要它在WebKit/Firefox中工作.

Gra*_*ham 38

我想你在找getOwnPropertyDescriptorhttps://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor

  • 有趣的是:`getOwnPropertyDescriptor`对于确定一个对象是否具有本地*定义的getter/setter非常有用,而`__lookupGetter__`实际上也会返回在原型上定义的getter. (3认同)

Jim*_*ert 27

您可以使用 Object.getOwnPropertyDescriptor(obj, prop)

例如:

var obj = { first: 1 }
obj.__defineGetter__('second', function() { return 2; });

// get descriptors
var descriptor1 = Object.getOwnPropertyDescriptor(obj, 'first');
var descriptor2 = Object.getOwnPropertyDescriptor(obj, 'second');

// check if it's a getter

descriptor2.get
// returns function () { return 2; }

descriptor1.get
// returns undefined
Run Code Online (Sandbox Code Playgroud)

  • Jim得到了内联示例的投票.繁荣. (3认同)
  • 请注意,它是**Own**PropertyDescriptor,因此它不会包含继承的属性或原型上定义的属性. (3认同)

Elo*_*eda 7

您可以使用Object.getOwnPropertyDescriptor(obj,prop)

function isGetter (obj, prop) {
  return !!Object.getOwnPropertyDescriptor(obj, prop)['get']
}
Run Code Online (Sandbox Code Playgroud)

用法:

obj = {
  foo: 'foo',
  get bar() { return 'bar' }
}

isGetter(obj, 'bar') // will return true
isGetter(obj, 'foo') // will return false
Run Code Online (Sandbox Code Playgroud)

  • 我最初的意图是编辑Jim的答案_“随着帖子的年龄增加更新” _,正如[Stack Overflow帮助>人们为什么可以编辑我的帖子中提到的那样] 编辑的工作原理?](https://stackoverflow.com/help/editing)。此编辑被拒绝的原因是:_“此编辑旨在向帖子的作者致意,作为编辑没有意义。应该将其写为评论或答案。” _。因此,这就是该答案的原因。 (4认同)