TypeScript?中使用?getter?和?setter的方法
使用 get 和 set 關(guān)鍵字在 TypeScript 中定義 getter 和 setter。 getter 使我們能夠?qū)傩越壎ǖ皆谠L問屬性時(shí)調(diào)用的函數(shù),而 setter 將屬性綁定到在嘗試設(shè)置屬性時(shí)調(diào)用的函數(shù)。
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 個(gè) getter 和 setter。
get 語法將對象屬性綁定到函數(shù),因此每次訪問該屬性時(shí),都會(huì)調(diào)用該函數(shù)。
當(dāng)我們訪問類實(shí)例的語言屬性時(shí),我們調(diào)用的是 language() 方法。
set 語法將對象屬性綁定到函數(shù),每次嘗試設(shè)置屬性時(shí),都會(huì)調(diào)用該函數(shù)。
需要注意的是,盡管我們在后臺(tái)調(diào)用類方法,但我們使用
getter和setter就像在對象上使用常規(guī)屬性一樣。
我們不應(yīng)嘗試將 setter 稱為 myInstance.mySetter('TypeScript'),而應(yīng)將屬性設(shè)置為 myInstance.mySetter = ‘TypeScript’。
請注意,我們在類中聲明 _language 和 _tasks 屬性時(shí)使用了 private 關(guān)鍵字。
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;
}
}具有私有可見性的類成員只能在類本身內(nèi)部訪問。
這很重要,因?yàn)槲覀儾幌M覀兊念惖南M(fèi)者能夠訪問 _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);
嘗試從類外部訪問私有屬性會(huì)導(dǎo)致錯(cuò)誤,這正是我們需要的,以確保消費(fèi)者按預(yù)期使用 getter 和 setter。
使用下劃線前綴,因?yàn)槲覀冃枰粋€(gè)不同的屬性名稱,以避免我們的 getter 和 setter 方法中的無限循環(huán)。
以下實(shí)現(xiàn)會(huì)導(dǎo)致無限循環(huán)。
class Developer {
private language = 'TypeScript';
set language(value: string) {
// ?? Error: Maximum call stack exceeded
this.language = value;
}
}
const dev = new Developer();代碼中的問題是 - 我們沒有使用下劃線來為類中的語言屬性添加前綴。
因此,每次調(diào)用
setter時(shí),它都會(huì)設(shè)置屬性,并在每次設(shè)置屬性時(shí)不斷調(diào)用自身。
如果我們只為特定屬性定義 getter,則該屬性會(huì)自動(dòng)標(biāo)記為只讀。
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';我們只為語言屬性分配了一個(gè) getter,因此不能重新分配它。
如果我們沒有顯式鍵入 setter 參數(shù),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 參數(shù),TypeScript 仍然知道它是 string 類型,因?yàn)檎Z言 getter 返回一個(gè) string 類型的值。
我們還可以設(shè)置在實(shí)例化類時(shí)使用 getter 和 setter 的屬性的值。
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"實(shí)例化類時(shí)調(diào)用構(gòu)造函數(shù)方法。 該方法采用語言參數(shù)并使用已定義的設(shè)置器初始化其值。
如果我們不想使用 setter 在構(gòu)造函數(shù)中初始化屬性,也可以使用 _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 方法為語言屬性設(shè)置初始值,因?yàn)槲覀冊趯傩郧懊婕由狭讼聞澗€。
到此這篇關(guān)于TypeScript 中如何使用 getter 和 setter的文章就介紹到這了,更多相關(guān)TypeScript 使用 getter 和 setter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CSS3 動(dòng)畫卡頓性能優(yōu)化的完美解決方案
今天小編就為大家分享一篇關(guān)于css3 動(dòng)畫卡頓性能優(yōu)化的完美解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-09-09
如何讓div span等元素能響應(yīng)鍵盤事件操作指南
在我這幾天的工作中遇到了一個(gè)問題,我有一個(gè)可編輯的div,并且在DIV里面還有一個(gè)可編輯的span,我想要讓span能響應(yīng)鍵盤事,想實(shí)現(xiàn)這種效果,應(yīng)該如何實(shí)踐呢2012-11-11
基于JavaScript實(shí)現(xiàn)飄落星星特效
這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)飄落星星特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
JavaScript基于數(shù)組實(shí)現(xiàn)的棧與隊(duì)列操作示例
這篇文章主要介紹了JavaScript基于數(shù)組實(shí)現(xiàn)的棧與隊(duì)列操作,結(jié)合實(shí)例形式分析了棧與隊(duì)列的操作原理及javascript使用數(shù)組實(shí)現(xiàn)棧與隊(duì)列的相關(guān)技巧,需要的朋友可以參考下2018-12-12
定時(shí)器(setTimeout/setInterval)調(diào)用帶參函數(shù)失效解決方法
setInterval()方法可按照指定的周期(以毫秒計(jì))來調(diào)用函數(shù)或計(jì)算表達(dá)式,setTimeout()方法用于在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式,詳細(xì)使用方法可以參考下本文2013-03-03
llqrcode js識(shí)別二維碼解析二維碼信息實(shí)例
這篇文章主要為大家介紹了llqrcode js識(shí)別二維碼解析二維碼信息實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
使用BootStrap實(shí)現(xiàn)用戶登錄界面UI
本文給大家介紹使用BootStrap實(shí)現(xiàn)用戶登錄界面UI,布局風(fēng)格采用左右各一半的風(fēng)格設(shè)計(jì),非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-08-08
基于JavaScript實(shí)現(xiàn)隨機(jī)顏色輸入框
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)隨機(jī)顏色輸入框的實(shí)例代碼,代碼簡單易懂,非常不錯(cuò),需要的朋友參考下吧2016-12-12

