ES6: How to access a static getter from an instance

22.6k Views Asked by At

How can i access a static getter from an instance of the class that implements that getter?

for example, i have this class:

class Component {
  static get isComponent() { return true; }

  constructor() {}
}

const c = new Component();

how can i call from "c" "isComponent" of "Component" class? I read around and all I found is something like that:

Object.getPrototypeOf(c).isComponent

but this is not working on my case because there is no "isComponent" method in Component prototype object. The above code works if I write the class like this:

Component.prototype.isComponent = () => { return true; }

but this is not the way i would like to write classes. What am I missing? tnx

2

There are 2 best solutions below

0
On BEST ANSWER

statics become properties of the constructor function, which you can access on an instance via the constructor property:

console.log(c.constructor.isComponent);

class Component {
  static get isComponent() { return true; }

  constructor() {}
}

const c = new Component();
console.log(c.constructor.isComponent); // true

Of course, that relies on constructor not having been mucked with. :-) Before the class syntax, you'd see people forgetting to set constructor properly in inheritance hierarchies all the time. Thankfully, with class syntax, it's handled automatically so people forgetting is no longer an issue.

In theory, the instance may have an "own" constructor property, shadowing the one on the prototype. So if that's a concern, you could go to the prototype:

console.log(Object.getPrototypeOf(c).constructor.isComponent);

class Component {
  static get isComponent() { return true; }

  constructor() {}
}

const c = new Component();
console.log(Object.getPrototypeOf(c).constructor.isComponent); // true


Alternatively, if you know what constructor it is, you can go direct to the source:

console.log(Component.isComponent);

class Component {
  static get isComponent() { return true; }

  constructor() {}
}

// const c = new Component(); <== Don't need it
console.log(Component.isComponent); // true

...but only if you know in advance that Component is the constructor you want.

0
On

The question you ask is wrong. You want the getter from an Instance of your Class but that not how statics work. I static is declared and initialized on the Class itself so if you want to get the value of it you should do it like this:

X = Component.isComponent

So don't call it on the instance but on the class itself. That sounds logical because a static does not have a this variable. The static has a value thats the same for all instances of your class.