diadia

興味があることをやってみる。自分のメモを残しておきます。

セッターゲッターについて

まずアクセス修飾子について

アクセス修飾子はクラスを基準としてアクセスできるかどうかを定めるものと考えると良い。

class Person{
    public name: string;

    constructor(name: string){
        this.name = name;
    };
}
let mario = Person("mario");
mario.name = 'maria';

console.log(mario.name);
// maria

クラス外でもnameプロパティにアクセスできるのがpublicで、これをクラス外からアクセスできないようにするにはprivateを使う。

class Person{
    private name: string;

    constructor(name: string){
        this.name = name;
    };
}
let mario = Person("mario");

console.log(mario.name);
// エラー クラス外からプロパティ値を参照できない

mario.name = 'maria';
// エラー クラス外からプロパティを変えられない

privateを使うことで疎結合できるメリットが有るってことらしい。ここはおいておく。 疎結合できることをメリットとすると、クラス外からアクセスする事ができない。

じゃあ特別に参照できるようにするわけで、その時にゲッターを使う。

class Person{
    private name: string;

    constructor(name: string){
        this.name = name;
    };

    get name(){
        return this.name
    };
}
let mario = Person("mario");

console.log(mario.name);
// mario

mario.name = 'maria';
// エラー クラス外からプロパティを変えられない

プロパティの値を変えたいって思うならセッターを使うことになる。ここで疑問。セッターを使えるようにしたら、それはpublicと同じではないか、と。
セッターを使う意義について考えてみたけど、例えばクラス外から参照はできないけどプロパティ属性を変える事ができる場合につかったり、クラス外から属性値をセットする際に不適切値だったらエラーを出すってことしか考えられない。このへんはなにかわかったら書き加えたいところだ。

class Person{
    private _name: string;

    constructor(name: string){
        this._name = name;
    };

    get name(){
        return this._name
    };

    set name(value:string){
        if (!value || value === '') { 
            throw new Error('値が不適切です');    
        }
        this._name = value;
    }
}
let mario = Person("mario");

console.log(mario.name);
// mario

mario.name = 'maria';

あとgetだけでsetがない場合はreadonlyに自動的になるみたい。