what are ES6 class getter and setter actually?

31,157

Solution 1

Yes, it can be done: Just drop the setter/getter syntax and add a property to the class during initialization instead:

class Person{
    constructor(name){
        this.name = name;
    }
}

The getter/setter syntax exists for properties that must be calculated based on other properties, like the area property from a circle of a given radius:

class Circle {
    constructor (radius) {
        this.radius = radius;
    }
    get area () {
        return Math.PI * this.radius * this.radius;
    }
    set area (n) {
        this.radius = Math.sqrt(n / Math.PI);
    }
}

Or getting the full name of a Person object with firstName and lastName properties. You get the idea.

Solution 2

As per MDN , The get syntax binds an object property to a function that will be called when that property is looked up.

Here you are returning just a string 'jack' it is not binding to any property.

Interestingly console.log(Person.prototype.name) logs jack

But Person.hasOwnProperty(name) logs false

also once we create instance of Person call i.e const x = new Person();

console.log(x.name) -> this throws error, cant read property x.name because x.hasOwnProperty(name) is false

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get

Share:
31,157
feiyuerenhai
Author by

feiyuerenhai

engineer @alibaba.com

Updated on April 20, 2020

Comments

  • feiyuerenhai
    feiyuerenhai about 4 years

    what are actually getter and setter methods in ES6 class definition? are they infact prototype props ? for examle:

    class Person{
      constructor(){};
      get name(){
        return 'jack';
      }
      set name(){
        // ???
      }
    }
    

    does this equals to Person.prototype.name = 'jack';

    and another question, i ve seen examples of setters which utilizes the instance's prop like:

    class Person{
      constructor(){
        this._name = 'jack';
      };
      get name(){
        return this._name;
      }
      set name(val){
        this._name = val;
      }
    }
    

    i dont wanna do this way, i want something like:

    class Person{
      constructor(){};
      get name(){
        return 'jack';
      }
      set name(val){
        // like this
        // name = val;
      }
    }
    

    what could be done?