中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

TypeScript中怎么使用getter和setter

發布時間:2023-05-09 17:22:53 來源:億速云 閱讀:131 作者:iii 欄目:開發技術

這篇文章主要介紹“TypeScript中怎么使用getter和setter”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“TypeScript中怎么使用getter和setter”文章能幫助大家解決問題。

使用 getset 關鍵字在 TypeScript 中定義 gettersettergetter 使我們能夠將屬性綁定到在訪問屬性時調用的函數,而 setter 將屬性綁定到在嘗試設置屬性時調用的函數。

class Developer {
  private _language = '';
  private _tasks: string[] = [];

  get language() {
    return this._language;
  }

  set language(value: string) {
    this._language = value;
  }

  get tasks() {
    return this._tasks;
  }

  set tasks(value: string[]) {
    this._tasks = value;
  }
}

const dev = new Developer();

dev.language = 'TypeScript';
console.log(dev.language); // ????? "TypeScript"

dev.tasks = ['develop', 'test'];
dev.tasks.push('ship');

console.log(dev.tasks); // ['develop', 'test', 'ship']

Developer 類有 2 個 gettersetter

get 語法將對象屬性綁定到函數,因此每次訪問該屬性時,都會調用該函數。

當我們訪問類實例的語言屬性時,我們調用的是 language() 方法。

set 語法將對象屬性綁定到函數,每次嘗試設置屬性時,都會調用該函數。

需要注意的是,盡管我們在后臺調用類方法,但我們使用 gettersetter 就像在對象上使用常規屬性一樣。

我們不應嘗試將 setter 稱為 myInstance.mySetter('TypeScript'),而應將屬性設置為 myInstance.mySetter = ‘TypeScript’

請注意,我們在類中聲明 _language_tasks 屬性時使用了 private 關鍵字。

class Developer {
  private _language = '';
  private _tasks: string[] = [];

  get language() {
    return this._language;
  }

  set language(value: string) {
    this._language = value;
  }

  get tasks() {
    return this._tasks;
  }

  set tasks(value: string[]) {
    this._tasks = value;
  }
}

具有私有可見性的類成員只能在類本身內部訪問。

這很重要,因為我們不希望我們的類的消費者能夠訪問 _language_tasks 屬性。

class Developer {
  private _language = '';
  private _tasks: string[] = [];

  get language() {
    return this._language;
  }

  set language(value: string) {
    this._language = value;
  }

  get tasks() {
    return this._tasks;
  }

  set tasks(value: string[]) {
    this._tasks = value;
  }
}

const dev = new Developer();

// ?? Error: Property '_language' is private
// and only accessible within class 'Developer'.ts(2341)
console.log(dev._language);

TypeScript中怎么使用getter和setter

嘗試從類外部訪問私有屬性會導致錯誤,這正是我們需要的,以確保消費者按預期使用 gettersetter

使用下劃線前綴,因為我們需要一個不同的屬性名稱,以避免我們的 gettersetter 方法中的無限循環。

以下實現會導致無限循環。

class Developer {
  private language = 'TypeScript';

  set language(value: string) {
    // ?? Error: Maximum call stack exceeded
    this.language = value;
  }
}

const dev = new Developer();

代碼中的問題是 - 我們沒有使用下劃線來為類中的語言屬性添加前綴。

因此,每次調用 setter 時,它都會設置屬性,并在每次設置屬性時不斷調用自身。

如果我們只為特定屬性定義 getter,則該屬性會自動標記為只讀。

class Developer {
  private _language = 'TypeScript';

  get language() {
    return this._language;
  }
}

const dev = new Developer();

console.log(dev.language); // ????? "TypeScript"

// ?? Cannot assign to 'language' because
//it is a read-only property.ts(2540)
dev.language = 'TypeScript';

我們只為語言屬性分配了一個 getter,因此不能重新分配它。

如果我們沒有顯式鍵入 setter 參數,TypeScript 能夠從 getter 的返回類型推斷它。

class Developer {
  private _language = '';

  get language() {
    return this._language;
  }

  // ????? (parameter) value: string (inferred)
  // from getter return type
  set language(value) {
    this._language = value;
  }
}

const dev = new Developer();

dev.language = 'TypeScript';

console.log(dev.language); // ????? "TypeScript"

即使我們沒有在 setter 中顯式鍵入 value 參數,TypeScript 仍然知道它是 string 類型,因為語言 getter 返回一個 string 類型的值。

我們還可以設置在實例化類時使用 gettersetter 的屬性的值。

class Developer {
  private _language = '';

  // ????? use a constructor method
  constructor(language: string) {
    this.language = language;
  }

  get language() {
    return this._language;
  }

  set language(value: string) {
    this._language = value;
  }
}

const dev = new Developer('TypeScript');

console.log(dev.language); // ????? "TypeScript"

dev.language = 'JavaScript';

console.log(dev.language); // ????? "JavaScript"

實例化類時調用構造函數方法。 該方法采用語言參數并使用已定義的設置器初始化其值。

如果我們不想使用 setter 在構造函數中初始化屬性,也可以使用 _language 屬性。

class Developer {
  private _language = '';

  constructor(language: string) {
    // ????? Not using setter (_language instead of language)
    this._language = language;
  }

  get language() {
    return this._language;
  }

  set language(value: string) {
    this._language = value;
  }
}

const dev = new Developer('TypeScript');

console.log(dev.language); // ????? "TypeScript"

dev.language = 'JavaScript';

console.log(dev.language); // ????? "JavaScript"

上面的示例沒有使用 setter 方法為語言屬性設置初始值,因為我們在屬性前面加上了下劃線。

關于“TypeScript中怎么使用getter和setter”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苍梧县| 武威市| 横峰县| 苏州市| 辽宁省| 莱州市| 河北省| 汝南县| 石嘴山市| 紫云| 蚌埠市| 楚雄市| 贵南县| 克东县| 南丰县| 古丈县| 宁强县| 韩城市| 西盟| 普格县| 罗定市| 巧家县| 日喀则市| 邯郸县| 卓资县| 杨浦区| 太原市| 怀来县| 延安市| 荆州市| 佳木斯市| 沙湾县| 株洲县| 汾阳市| 卓尼县| 衡东县| 石河子市| 呈贡县| 河东区| 江安县| 彰化县|