javascript ES6 class with getters only
Здравейте, искам да попитам защо ми дава грешка, че полетата са "Read only" , когато пиша само getter-и без setter-и в клас на ES6?
Това ми е кода:
class BasePunchStarter { constructor(id,name,manufacturer,description,genres,targetPrice){ if(new.target==BasePunchStarter){ throw new TypeError("BasePunchStarter class cannot be instantiated directly!"); } if(typeof id =="number") { //noinspection JSUnresolvedVariable this.id = id; }else throw new TypeError("ID must be a number!"); if(typeof name=="string") { //noinspection JSUnresolvedVariable this.name = name; }else throw new TypeError("Name must be a string!"); if(typeof manufacturer=="string") { //noinspection JSUnresolvedVariable this.manufacturer = manufacturer; }else throw new TypeError("Manufacturer must be a string!"); if(typeof description=="string") { //noinspection JSUnresolvedVariable this.description = description; }else throw new TypeError("Description must be a string!"); if(typeof genres=="Object"){ //noinspection JSUnresolvedVariable this.genres=genres; }else new TypeError("Genres must be an Array of strings!"); if(typeof targetPrice=="number") { //noinspection JSUnresolvedVariable this.targetPrice = targetPrice; }else new TypeError("Target price must be a number!"); this.accumulatedMoney=0; } get accumulatedMoney(){ return this._accumulatedMoney; } set accumulatedMoney(money){ this._accumulatedMoney=money; } get id(){ return this._id; } get name(){ return this._name; } get manufacturer(){ return this._manufacturer; } get description(){ return this._description; } get genres(){ return this._genres; } get targetPrice(){ return this._targetPrice; } } module.exports = BasePunchStarter; Използвам "//noinspection JSUnresolvedVariable" за да не ми пищи за грешката и няма проблем, но едва ли е най-добрият вариянт за справяне с проблема.
Условието на задачата е :
Implement the BasePunchStarter class, so that it is initialized with the following parameters:
The class should only hold getters for those properties, no setters! Make sure each parameter is of the right type, otherwise throw a TypeError.
The class also has another property, which is private, but has getter and setter. The property is accumulatedMoney. It’s initial value is 0. It is a NUMBER.
Make sure the base class cannot be instantiated directly. Throw an Error if such an attempt is made.
Как предлагаш да стане?
Constructor (args...) {
This.accumulatedMoney = 0;
}
Set accumulatedMoney() {
This._accumulatedMoney = 0;
}
Get accumulatedMoney() {
Return this._accumulatedMoney
}
UpdateAccumulatedMoney(newMoney) {
This._accumulatedMoney += newMoney;
}
Така реално имаш 2 променливи accumulatedMoney. И когато кажеш BasePunchStarter.accumulatedMoney - ще вземеш стойността от гетера с променливата _accumulatedMoney, която е извън конструктора, каквато е и целта на тези private променливи. Пазят конструктора от злонамерен и директен достъп. Малко е тъпо ООП-то в javaScript, цяла вечер се мъчех и аз с един метод в един клас.
Накрая имаш и едон метод, който достъпваш с BasePunchStarter.updateAccumulatedMoney(newMoney);
И така променяш стойността на _accumulatedMoney. Не можеш да направиш ъова през сетъра, той се изпълнява само веднъж при инстанцирането на класа.