title: ES6 JS Class underscore set and get methods return "Maximum call stack size exceeded"
body: <p>I am trying to understand JS ES6 classes and my problem is getting "Maximum call stack size exceeded" when I am reffering to "this." variables. Let's look at this example:</p>
  
  <pre><code>class Human {
    constructor(age) {
      this.age = age;
      // "this._age = age;" output:
      // Property age of instance without underscore: 34
      // Property age of instance with underscore: 34
    }
  
    get age() {
      return this._age;
      // Without underscore error: "Uncaught RangeError: Maximum call stack size exceeded"
    }
  
    set age(age) {
      this._age = age;
      // Without underscore error: "Uncaught RangeError: Maximum call stack size exceeded"
      console.log(`Without underscore: ${this.age}`);
      console.log(`With underscore: ${this._age}`);
    }
  }
  
  let john = new Human(34);
  console.log(`Property age of instance without underscore: ${john.age}`);
  console.log(`Property age of instance with underscore: ${john._age}`);
  </code></pre>
  
  <p>Why I need to use that underscore in get and set methods? Why outputs are changing like that when i use it in constructor? Why there is no metter I use underscore or not when I am reffering to instance properties? In mdn documentation there is even no underscore at all.</p>