【问题标题】:Determine if a JavaScript property has a getter or setter defined?确定 JavaScript 属性是否定义了 getter 或 setter?
【发布时间】:2012-01-25 09:16:00
【问题描述】:

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

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

【问题讨论】:

  • 你的 getter 和 setter 方法是如何定义的? getSomethingsetSomething?
  • 不,使用真正的 JavaScript getter 和 setter 以及 __defineGetter____defineSetter__
  • 如果您使用的是 ES6 类,则以下答案均无效。 class Box { get type() { return "Box"; } } var box = new Box(); var desc = Object.getOwnPropertyDescriptor(box, "type"); console.log(desc); // undefined

标签: javascript properties getter-setter


【解决方案1】:

我想你在找getOwnPropertyDescriptor

【讨论】:

  • OK 在这种情况下我认为不可能,除非 Safari 也支持 lookupGetter developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
  • 我的错误——看起来 Safari 确实 支持 getOwnPropertyDescriptor,但我错过了它,因为它是 Object 对象上的一个属性。这似乎是执行此操作的更标准方式,尽管我更喜欢在相关对象本身上调用函数的语法。
  • 有趣的注释:getOwnPropertyDescriptor 可用于确定对象是否在本地定义了 getter/setter,而 __lookupGetter__ 实际上会返回原型上定义的 getter好吧。
  • 此方法不适用于类对象。正确的 ?我创建了一个测试用例,但没有工作。 codesandbox.io/s/blissful-bas-m4nxo?file=/src/index.js
【解决方案2】:

您可以使用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

【讨论】:

【解决方案3】:

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

【讨论】:

    【解决方案4】:

    为您的 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.');
    

    【讨论】:

      【解决方案5】:

      您可以使用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 获得了我对内联示例的投票。轰隆隆。
      • 请注意,它是 getOwnPropertyDescriptor,因此它不会包含继承的属性或原型上定义的属性。
      猜你喜欢
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多