'Use setter to validate parameter in constructor

Javascript

Can setter used to validate parameter when creating new object, as seen on this code, the string input on numberOfStudents bypass the setter

class School {
  constructor(name, level, numberOfStudents) {
    this._name = name;
    this._level = level;
    this._numberOfStudents = numberOfStudents;
  }

  get numberOfStudents() {
    return this._numberOfStudents;
  }

  set numberOfStudents(value) {
    if (isNaN(value)) {
      console.log('Invalid input: numberOfStudents must be set to a Number.');
    } else {
      return (this._numberOfStudents = value);
    }
  }
}

const primaryOne = new School('Primary One', 'L1', 'ten');

prints

School { _name: 'Primary One', _level: 'L1', _numberOfStudents: 'ten' }

Please help



Solution 1:[1]

You're bypassing the validation because you're assigning to the internal _numberOfStudents property. The setter is only run when you assign to numberOfStudents. So change the constructor to do that:

class School {
  constructor(name, level, numberOfStudents) {
    this._name = name;
    this._level = level;
    this.numberOfStudents = numberOfStudents;
  }

  get numberOfStudents() {
    return this._numberOfStudents;
  }

  set numberOfStudents(value) {
    if (isNaN(value)) {
      console.log('Invalid input: numberOfStudents must be set to a Number.');
    } else {
      this._numberOfStudents = value;
    }
  }
}

const primaryOne = new School('Primary One', 'L1', 'ten');

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Barmar