2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【TypeScript】クラスのプロパティにつけるprivateとreadonlyの違い

Last updated at Posted at 2021-04-12

private修飾子を付けたプロパティはクラス内からのみ参照できる
readonly修飾子を付けたプロパティは読み込み専用になる

...🤔?

読んでもわからなかったので、調査してみました。

private修飾子を付けたプロパティは

  • クラス内で値を呼び出し可能

    this.プロパティ名
  • クラス内で値を書き換え可能

    this.プロパティ名 = 新しい値
  • ゲッターで値を呼び出し可能

    インスタンス名.ゲッター名
  • セッターで値を書き換え可能

    インスタンス名.セッター名 = セッターに渡す引数
  • サブクラス内で値を呼び出し不可

    this.プロパティ名 ←Error
  • サブクラス内で値を書き換え不可

    this.プロパティ名 = 新しい値 ←Error
  • サブクラスのインスタンスでメインクラスから継承したゲッターを使って値を呼び出し可能

    サブクラスのインスタンス名.メインクラスのゲッター名
  • サブクラスのインスタンスでメインクラスから継承したセッターを使って値を呼び出し可能

    ``サブクラスのインスタンス名.メインクラスのセッター名 = セッターに渡す引数`

readonly修飾子を付けたプロパティは

  • クラス内で値を呼び出し可能

    this.プロパティ名
  • クラス内で値を書き換え不可

    this.プロパティ名 = 新しい値 ←Error
  • ゲッターで値を呼び出し可能

    インスタンス名.ゲッター名
  • セッターで値を書き換え不可

    インスタンス名.セッター名 = セッターに渡す引数 ←Error

    そもそもセッター内でthis.プロパティ名 = 新しい値 ←Error
  • サブクラスで値を呼び出し可能

    this.プロパティ名
  • サブクラスで値を書き換え不可

    this.プロパティ名 = 新しい値 ←Error
  • サブクラスのインスタンスでメインクラスから継承したゲッターを使って値を呼び出し可能

    サブクラスのインスタンス名.メインクラスのゲッター名
  • サブクラスのインスタンスでメインクラスから継承したセッターを使って値を呼び出し不可

    そもそもメインクラスのセッター内でthis.プロパティ名 = 新しい値 ←Error

参考(試行錯誤の跡地)

コメントとかおかしなところがあるかもしれませんが。


class Hito {
  name: string;
  private _age: number;

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

  get age() {
    return `_age: ${this._age}`
  }

  set changeAge(age: number) {
    this._age = age;
  }

  debug() {
    return `_age: ${this._age}`;
  }
}

const me = new Hito('Taro', 30);

console.log(me.name) // Taro

// console.log(me._age)
// Error Property '_age' is private and only accessible within class 'Hito'.
// Error プロパティ '_age' はプライベートで、クラス 'Hito' 内でのみアクセスできます。

// me._age = 20;
// Error Property '_age' is private and only accessible within class 'Hito'.
// Error プロパティ '_age' はプライベートで、クラス 'Hito' 内でのみアクセスできます。

console.log(me.debug()); // _age: 30
console.log(me.age); // _age: 30
me.changeAge = 20;
console.log(me.debug()); // _age: 30
console.log(me.age); // _age: 30

class Hito2 {
  name: string;
  readonly _age: number;

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

  get age() {
    return `_age: ${this._age}`
  }

  set changeAge(age: number) {
    this._age = age;
    // Error Cannot assign to '_age' because it is a read-only property.
    // Error 読み取り専用プロパティであるため、'_age' に代入することはできません。
  }

  debug() {
    return `_age: ${this._age}`;
  }
}

console.log(`=====`)


const me2 = new Hito2('Taro', 30);

console.log(me2.name) // taro

// console.log(me._age)
// Error Property '_age' is private and only accessible within class 'Hito'.
// Error プロパティ '_age' はプライベートで、クラス 'Hito' 内でのみアクセスできます。

// me._age = 20;
// Error Property '_age' is private and only accessible within class 'Hito'.
// Error プロパティ '_age' はプライベートで、クラス 'Hito' 内でのみアクセスできます。

console.log(me2.debug()); // _age 30
console.log(me2.age); // _age 30
me2.changeAge = 20;
console.log(me2.debug()); // _age 30
console.log(me2.age); // _age 30

console.log(`=====`)

class NewHito extends Hito{
  constructor(name: string, _age: number) {
    super(name, _age)
  }
  debug2() {
    return `${this._age}`
    // Error プロパティ '_age' はプライベートで、クラス 'Hito' 内でのみアクセスできます。
  }
}

const me3 = new NewHito('Momoko', 42);

console.log(me3._age)
// Error プロパティ '_age' はプライベートで、クラス 'Hito' 内でのみアクセスできます
me3._age = 80
// Error プロパティ '_age' はプライベートで、クラス 'Hito' 内でのみアクセスできます。
console.log(me3.debug2()); // _age 42
console.log(me3.age); // _age 42
me3.changeAge = 20;
console.log(me3.debug()); // _age 20
console.log(me3.age); // _age 20

console.log(`=====`)

class NewHito2 extends Hito2{
  constructor(name: string, _age: number) {
    super(name, _age)
  }
  debug2() {
    return `${this._age}`
  }
}

const me4 = new NewHito2('Momoko', 42);

console.log(me4._age) // 42
// me4._age = 80
// 読み取り専用プロパティであるため、'_age' に代入することはできません。
console.log(me4.debug()); // _age 42
console.log(me4.age); // _age 42
me4.changeAge = 20;
console.log(me4.debug()); // _age 20
console.log(me4.age); // _age 20
2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?