最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TypeScript中Getter/Setter用法詳解

 更新時間:2024年10月24日 09:14:14   作者:Hamm  
getter使我們能夠將屬性綁定到在訪問屬性時調用的函數,而setter將屬性綁定到在嘗試設置屬性時調用的函數,下面就跟隨小編來看看TypeScript中Getter/Setter的用法吧

一、寫在前面

第一天

寫在前面,先看幾段代碼,用你的大腦編譯運行一下試試? No errors, no warnings!

const config = new Config()
config.version = '1.0.0'
console.log(config.version)

乍一看,這代碼會打印 1.0.0,于是跑一下試試?

于是打開 Config 類看看,好家伙

export class Config {
  private _version!: string

  public get version(): string {
    return this._version
  }

  public set version(value: string) {
    this._version = '莫挨勞資'
  }
}

原來是 getter/setter ??!這玩意我熟!原來 config.version = '1.0.0' 不是給 Config 的 version 字段賦值,而是調用了一個 versionset 方法。

這點我可是很不喜歡的,這已經讓人產生了心智負擔,賦值、方法調用傻傻分不清楚,還得看了實現才知道。

第二天

你再問我上面的問題,我可不敢拍著胸脯說答案了。

于是第二個問題又來了

const user = new User()
user.name = '彭于晏'
user.age = 33
user.length = '15cm'
console.log(JSON.stringify(user))

憑我三十余年生活經驗,這不是在序列化JSON到字符串嗎?分分鐘在腦海里編譯運行,肯定輸出這個?。?/p>

{"name":"彭于晏","age":33,"length":"15cm"}

因為昨天上當了,今天還是驗證跑一下看看結果:

額,這是什么時候走漏的風聲?

表示不服,再一次打開 User 類看看究竟,不看不知道,一看好家伙~

export class User {
  /**
   * # 昵稱
   */
  private nickname!: string

  public get name(): string {
    return this.nickname
  }

  public set name(value: string) {
    this.nickname = 'Hamm'
  }

  /**
   * # 年齡
   */
  private year!: number

  public get age(): number {
    return this.year
  }

  public set age(value: number) {
    this.year = 22
  }

  /**
   * # 長度
   */
  private len!: string

  public get length(): string {
    return this.len
  }

  public set length(value: string) {
    this.len = `${parseInt(value.replace('cm', '')) + 3}cm`
  }
}

這誰干的!干得漂亮?。?!

以上劇情純屬事實,如有雷同,你也很棒!

二、我不太喜歡Getter和Setter

1. vscode自動重構的屬性名帶下劃線

vscode 提供了屬性一鍵自動生成 getter/setter,為了保持屬性名和方法名不重復,于是會自動生成一個屬性名前面加下劃線的新屬性,然后將原屬性干掉并生成 get set 兩個方法。

生成的最終結果如下圖

雖然在生成過程中可以新起一個自定義屬性名,但我真的很煩,如果使用默認,我的 eslint 規(guī)則又會認為 屬性名不符合規(guī)范。。。

2. 調用方的心智負擔

如下面之前貼過的代碼:

const config = new Config()
config.version = '1.0.0'
console.log(config.version)

在不閱讀 Config 類的情況下,會主觀認為 config.version = "1.0.0" 是在給 屬性賦值,而調用 let version = config.version 會認為是將剛才賦的值取出來使用。

3. Get/Set方法和普通方法區(qū)別對待

在有 private protected public 等訪問修飾符的情況下,類本身有 屬性、方法、構造 就已經足夠滿足需求了,這里非得上一個 get set 連寫法都要區(qū)別對待的特殊方法形式,構造方法 constructor 表示第一個不服,勞資都沒特殊對待,憑什么它倆要特殊對待?

4. 我理解的屬性

屬性應該是一個類上最基礎的最終數據存儲,設置到屬性上的值是什么,那取出來的值也一定得是什么:

老張,我這瓶水放你這,一會我來拿。

這里我其實是調用了老張的一個賦值。所以一會回來拿到的水,還是那瓶水:

const store = new Store()
store.water = "哇哈哈"

// a few moments later

console.log(store.water) // 哇哈哈

所以,上面的輸出一定得是 哇哈哈 才合理, 第一天碰到的問題,就不應該存在。

5. 我理解的方法

方法應該是一個類上的 委托事項流程 的整合體,不管是普通方法,還是get/set,甚至是 構造方法。

只是構造方法比較特殊,也應該是整個類中唯一的特殊。

get / set 方法都應該只是從規(guī)范上形成的一些約定俗成的方法,而且既然是方法,get / set 的調用都應該加上 括號 (),才會便于理解。而且方法名和屬性名也沒有一定不重復的限定。

三、Getter/Setter的優(yōu)勢

簡單說一些吧。

1. 數據攔截

利用 get set 方法來做數據攔截,這個點這篇文章中不過多講,可以參考一些前端框架的雙向數據綁定實現來學習。

2. 數據轉換

在前后端數據轉換時,除了我們之前使用的 基于裝飾器-我是這么處理TypeScript項目數據轉換的 之外,使用 get set 來做數據轉換可能也會是一個很棒的方式(當然,屬性名get/set 不能重復的問題,還可以再思考思考)。

以上就是TypeScript中Getter/Setter用法詳解的詳細內容,更多關于TypeScript Getter/Setter的資料請關注腳本之家其它相關文章!

相關文章

最新評論

中江县| 大方县| 闸北区| 天峨县| 沅陵县| 周口市| 广饶县| 洞口县| 金溪县| 沙洋县| 桃源县| 睢宁县| 亳州市| 菏泽市| 黄陵县| 肇州县| 青岛市| 饶河县| 宝清县| 新平| 衡南县| 黄梅县| 高州市| 丰宁| 顺昌县| 永清县| 西城区| 兴安盟| 清水县| 大埔区| 遂宁市| 宜兴市| 岑溪市| 石门县| 西青区| 鲜城| 原平市| 山阳县| 大埔县| 泰安市| 新绛县|