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

IT技术 javascript properties getter-setter
2021-03-07 08:26:32

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

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

5个回答

我想你在找getOwnPropertyDescriptor

有趣的注意事项:getOwnPropertyDescriptor对于确定对象是否具有本地定义的 getter/setter 很有用,而__lookupGetter__实际上也会返回在原型上定义的 getter。
2021-04-22 08:26:32
好吧,在这种情况下,我认为这是不可能的,除非 Safari 还支持lookupGetter developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
2021-04-27 08:26:32
此方法不适用于类对象。对 ?我创建了一个测试用例,但没有用。codeandbox.io/s/blissful-bas-m4nxo?file=/src/index.js
2021-05-12 08:26:32
我的不好 - 看起来 Safari确实支持getOwnPropertyDescriptor,但我错过了它,因为它是Object对象上的一个属性这似乎是更标准的方法,尽管我更喜欢在有问题的对象本身上调用函数的语法。
2021-05-17 08:26:32

您可以使用 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
Jim 获得了我对内联示例的投票。繁荣。
2021-04-30 08:26:32
请注意,它获得了自己的PropertyDescriptor,因此它不会包含继承的属性或在原型上定义的属性。
2021-05-05 08:26:32

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

function isGetter (obj, prop) {
  return !!Object.getOwnPropertyDescriptor(obj, prop)['get']
}

用法:

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

isGetter(obj, 'bar') // will return true
isGetter(obj, 'foo') // will return false
此答案是 Jim Schubert 答案的更新,因为自 2011 年以来__defineGetter__已被弃用
2021-04-20 08:26:32
我的初衷是编辑 Jim 对“随着帖子老化而添加更新”的回答,正如Stack Overflow 帮助 > 为什么人们可以编辑我的帖子中提到的那样编辑是如何工作的?. 此编辑被拒绝的原因是:“此编辑旨在针对帖子的作者,作为编辑没有任何意义。它应该写成评论或回答。” . 因此,这就是这个答案的原因。
2021-05-11 08:26:32

Object.defineProperty's getset如果未在描述符中定义,则方法默认值将是未定义的。这是理想的识别方式。

举个例子:

var User = {};

Object.defineProperty(User, 'name', {
    get: function () {
        return _name;
    },
    enumerable: true
});

Object.defineProperty(User, 'designation', {
    get: function () {
        return _designation;
    },
    set: function (val) {
        _designation = val;
    },
    enumerable: true
});


var d = Object.getOwnPropertyDescriptor(User, 'name');
console.log(d.set == undefined);

参考:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

为您的 Java 脚本要求找到示例对象模板:

var Man=function(n,a){
  var name,age;

  function getName(){
       return this.name;
  }

  function getAge(){
       return this.age;
  }
  function create(){
       this.name=n;
       this.age=a;
       console.log('new object created');
  }

  function setAge(age){
       this.age=age;
  }

  function setName(name){
      this.name=name;
  }
  return{
   name:n,
   age:a,
   getName:getName,
   getAge:getAge,
   setName:setName,
   setAge:setAge
  };
}

var m1=new Man('Chaiguy',30);

// To check if Property exist for an Object
console.log(m1.hasOwnProperty('name'));

// To get the name and age of the object

console.log(m1.getName()+' is '+m1.getAge()+' years old.');