Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How can I get getter functions in javascript?

I’m trying to get getter functions in javascript instance.

Ideal(pseudo):

class T {
  internal values = a, b
  getters = c, d
}

const getters = []
for (key in test) {
  if (test[key] is getter)
    getters.push(test[key])
}
getters.forEach(getter => (getter.bind(test))()) // calls c() and d()

I thought Object.getOwnPropertyDescriptors can give me a getters, but it didn’t work.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

I saw the prototype(if I make instance via class) has getters, but I cannot access these values.

My code:

class Test {
  constructor() {
    this.a = 1;
    this.b = 2;
  }

  get c() { return this.a; }
  get d() { this.a + this.b; }
}

const test = new Test();

Object.getOwnPropertyDescriptors(test.__proto__);
/*
  Object { constructor: {…}, c: {…}, d: {…} }
   c: Object { get: c(), enumerable: false, configurable: true, … }
   constructor: Object { writable: true, enumerable: false, configurable: true, … }
   d: Object { get: d(), enumerable: false, configurable: true, … }
*/
test.__proto__.c; // undefined
test.__proto__.c(); // Uncaught TypeError: test.__proto__.c is not a function

There is c in prototype, but I can’t access these values.

Is there any way to get these getters?

If link that I have to read exists, please notice me.
Thank you.

>Solution :

You need to extract the get property from the descriptor and then use that – if you try to access the .c property directly, you’ll be invoking the getter (or setter).

class Test {
  constructor() {
    this.a = 1;
    this.b = 2;
  }

  get c() { return this.a; }
  get d() { this.a + this.b; }
}

const test = new Test();
const testGetters = Object.values(Object.getOwnPropertyDescriptors(Object.getPrototypeOf(test)))
  .filter(descriptor => descriptor.get)
  .map(descriptor => descriptor.get);
console.log(testGetters);
console.log('Invoking getter manually:', testGetters[0].call(test));
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading