mardi 21 avril 2015

Can't enumerate getters/setters properties

I am working on some reflections code to try to scrape out properties and functions, but I can't seem to get the getters/setters at all.

The reflection code I have for properties is:

Reflector = function() { };

Reflector.getProperties = function(obj) {
  var properties = [];
  var proto = obj;
  while (proto != Object.prototype) {
    console.log('Scrapping proto: ', proto);
    for (var prop in proto) {
      console.log('typeof ' + prop + ": ", typeof obj[prop]);
      if (typeof obj[prop] != 'function') {
        properties.push(prop);
      }
    }
    proto = Object.getPrototypeOf(proto);
  }
  return properties;
};

And a sample of it running (with my debug messages) is:

var SimpleTestObject = function() {
  this.value = "Test1";
  this._hiddenVal = "Test2";
  this._readOnlyVal = "Test3";
  this._rwVal = "Test4";
};
SimpleTestObject.prototype = {
  get readOnlyVal() {
    return this._readOnlyVal;
  },
  get rwVal() {
    return this._rwVal;
  },
  set rwVal(value) {
    this._rwVal = value;
  },
  func1: function() {
    // Test
  }
};
SimpleTestObject.func2 = function(test) { /* Test */ };
SimpleTestObject.outsideVal = "Test5";

var props = Reflector.getProperties(SimpleTestObject);
console.log('props: ', props);
console.log('Object.getOwnPropertyNames: ', Object.getOwnPropertyNames(SimpleTestObject));
console.log('rwVal property descriptor: ', Object.getOwnPropertyDescriptor(SimpleTestObject, 'rwVal'));
console.log('rwVal (2) property descriptor: ', Object.getOwnPropertyDescriptor(Object.getPrototypeOf(SimpleTestObject), 'rwVal'));

What I expect to see as output to my Reflection.getProperties(SimpleTestObject) is ['readOnlyVal', 'rwVal', 'outsideVal'], but instead I am only seeing outsideVal. Further, when I tried to using getOwnPropertyDescriptor() to see if the rwVal was enumerable, it came back as undefined. So, thinking maybe it somehow got showed into the prototype above, I tried going up a level and still got undefined.





Aucun commentaire:

Enregistrer un commentaire