1

Opposed to my expectation I can't access my class field myLibrary in the class method initialize().

class ViewController {
      myLibrary = new Library();
      initialize() {
        console.log(myLibrary); // undefined

The only "solution" I found was to declare myLibrary outside of the class as a global variable. Is there a way to declare fields in a class and then, well, use them?

Ben_R
  • 73
  • 4
  • 1
    `this.myLibrary`…? – deceze Mar 28 '22 at 09:46
  • Side note: If this really is a View controller, then it would be a singleton. In that case, do you really need the class? Can't you just create it as an object with properties and methods? – trincot Mar 28 '22 at 09:48
  • You may want to read the documentation, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes - while the example about [field declarations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#field_declarations) is not the brightest one, it already shows that even in the constructor you would need to use `this` to access member variables. – tevemadar Mar 28 '22 at 10:15
  • @deceze `this` may or may not refer to the instance of `ViewController` that OP has initialized. This depends on the context in which it is called. – Him Oct 19 '22 at 21:12

2 Answers2

1

JavaScript classes do not work the same way as Java classes.

To access properties on an object you need to state the object and then access a property on it. They aren't treated as variables in the current scope.

Inside a method, the keyword this will give you the associated object. (See How does the "this" keyword work? for a less simplified explanation).

So you need this.myLibrary instead of just myLibrary.

Quentin
  • 914,110
  • 126
  • 1,211
  • 1,335
1
class Library {
  …
}

class ViewController {
  constructor() {
    this.myLibrary = new Library();
  }

  log() {
    console.log(this.myLibrary);
  }
}

const viewController = new ViewController();
viewController.log()
marcobiedermann
  • 4,317
  • 3
  • 24
  • 37