激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - 盤點JavaScript中Getter()和Setter()函數的使用

盤點JavaScript中Getter()和Setter()函數的使用

2021-08-31 22:39前端進階學習交流前端進階者 JavaScript

Getter/setter 可以用作“真實”屬性值的包裝器,以便對它們進行更多的控制。

盤點JavaScript中Getter()和Setter()函數的使用

大家好,我是進階學習者。

一、前言

有兩種類型的屬性。

第一種是 數據屬性。已經知道如何使用它們了。到目前為止,使用過的所有屬性都是數據屬性。

第二種類型的屬性是新東西。它是 訪問器屬性(accessor properties)。它們本質上是用于獲取和設置值的函數,但從外部代碼來看就像常規屬性。

二、Getter 和 setter

訪問器屬性由 “getter” 和 “setter” 方法表示。在對象字面量中,它們用 get和 set表示:

  1. let obj = {   
  2.     get propName() {    // 當讀取 obj.propName 時,getter 起作用  
  3. },  set propName(value) {  
  4.   // 當執行 obj.propName = value 操作時,setter 起作用   
  5. }}; 

當讀取 obj.propName時,getter 起作用,當 obj.propName被賦值時,setter 起作用。

例:

有一個具有 name和 surname屬性的對象 user:添加一個 fullName屬性,該屬性值應該為 "John Smith"。當然,不想復制粘貼已有的信息,因此可以使用訪問器來實現:

  1. let user = { 
  2.   name"John"
  3.   surname: "Smith"
  4.   get fullName() { 
  5.     return `${this.name} ${this.surname}`; 
  6.   } 
  7. }; 
  8. alert(user.fullName); // John Smith 

從外表看,訪問器屬性看起來就像一個普通屬性。

這就是訪問器屬性的設計思想。不以函數的方式 調用 user.fullName,正常 讀取 它:getter 在幕后運行。

盤點JavaScript中Getter()和Setter()函數的使用

截至目前,fullName只有一個 getter。如果嘗試賦值操作 user.fullName=,將會出現錯誤:

  1. let user = { 
  2.   get fullName() { 
  3.     return `...`; 
  4.   } 
  5. }; 
  6. user.fullName = "Test"; // Error(屬性只有一個 getter) 

讓通過為 user.fullName添加一個 setter 來修復它:

  1. let user = { 
  2.   name"John"
  3.   surname: "Smith"
  4.   get fullName() { 
  5.     return `${this.name} ${this.surname}`; 
  6.   }, 
  7.   set fullName(value) { 
  8.     [this.name, this.surname] = value.split(" "); 
  9.   } 
  10. }; 
  11. // set fullName 將以給定值執行 
  12. user.fullName = "Alice Cooper"
  13. alert(user.name); // Alice 
  14. alert(user.surname); // Cooper 

現在,就有一個“虛擬”屬性。它是可讀且可寫的。

盤點JavaScript中Getter()和Setter()函數的使用

三、訪問器描述符

例:

要使用 defineProperty創建一個 fullName訪問器,可以使用 get和 set來傳遞描述符:

  1. let user = { 
  2.   name"John"
  3.   surname: "Smith" 
  4. }; 
  5. Object.defineProperty(user'fullName', { 
  6.   get() { 
  7.     return `${this.name} ${this.surname}`; 
  8.   }, 
  9.   set(value) { 
  10.     [this.name, this.surname] = value.split(" "); 
  11.   } 
  12. }); 
  13. alert(user.fullName); // John Smith 
  14. for(let key in user) alert(key); // name, surname 

盤點JavaScript中Getter()和Setter()函數的使用

注:

一個屬性要么是訪問器(具有 get/set方法),要么是數據屬性(具有 value),但不能兩者都是。

四、更聰明的 getter/setter

Getter/setter 可以用作“真實”屬性值的包裝器,以便對它們進行更多的控制。

例:

如果想禁止太短的 user的 name,可以創建一個 setter name,并將值存儲在一個單獨的屬性 _name中:

  1. let user = { 
  2.   get name() { 
  3.     return this._name; 
  4.   }, 
  5.   set name(value) { 
  6.     if (value.length < 4) { 
  7.       alert("Name is too short, need at least 4 characters"); 
  8.       return
  9.     } 
  10.     this._name = value; 
  11.   } 
  12. }; 
  13. user.name = "Pete"
  14. alert(user.name); // Pete 
  15. user.name = ""; // Name 太短了…… 

盤點JavaScript中Getter()和Setter()函數的使用

注:

從技術上講,外部代碼可以使用 user._name直接訪問 name。但是,這兒有一個眾所周知的約定,即以下劃線 "開頭的屬性是內部屬性,不應該從對象外部進行訪問。

五、兼容性

訪問器的一大用途是,它們允許隨時通過使用 getter 和 setter 替換“正常的”數據屬性,來控制和調整這些屬性的行為。

開始使用數據屬性 name和 age來實現 user 對象:

  1. function User(name, age) { 
  2.   this.name = name
  3.   this.age = age; 
  4. let john = new User("John", 25); 
  5. alert( john.age ); // 25 

盤點JavaScript中Getter()和Setter()函數的使用

但情況可能會發生變化。

可能會決定存儲 birthday,而不是 age,因為它更精確,更方便:

現在應該如何處理仍使用 age屬性的舊代碼呢?

可以嘗試找到所有這些地方并修改它們,但這會花費很多時間,而且如果其他很多人都在使用該代碼,那么可能很難完成所有修改。

為 age添加一個 getter 來解決這個問題:

  1. function User(name, birthday) { 
  2.                 this.name = name
  3.                 this.birthday = birthday; 
  4.                 // 年齡是根據當前日期和生日計算得出的 
  5.                 Object.defineProperty(this, "age", { 
  6.                     get() { 
  7.                         let todayYear = new Date().getFullYear(); 
  8.                         return todayYear - this.birthday.getFullYear(); 
  9.                     } 
  10.                 }); 
  11.             } 
  12.             let john = new User("John", new Date(1992, 6, 1)); 
  13.             alert(john.birthday); // birthday 是可訪問的 
  14.             alert(john.age); // ……age 也是可訪問的 

現在舊的代碼也可以工作,而且還擁有了一個不錯的附加屬性。

盤點JavaScript中Getter()和Setter()函數的使用

六、總結

本文基于JavaScript基礎,介紹了getter 和 setter函數的使用。對于其中的屬性,通過案例的樣式,運行效果圖的展示,進行詳細的講解。同時拓展相對于的內容,希望能夠幫助你更好的理解。

歡迎大家積極嘗試,有時候看到別人實現起來很簡單,但是到自己動手實現的時候,總會有各種各樣的問題,切勿眼高手低,勤動手,才可以理解的更加深刻。

代碼很簡單,希望對你學習有幫助。

原文地址:https://mp.weixin.qq.com/s/5EVHlwXG-JZgCgRuhVa2wA

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 毛片免费在线观看 | 99久久婷婷国产综合精品青牛牛 | 欧美性猛交xxx乱大交3蜜桃 | 久久精品av | 草莓福利视频在线观看 | 国产一区在线视频观看 | 看免费毛片 | 精精国产xxxx视频在线播放7 | 69性欧美高清影院 | 91精品久久久久久 | 香蕉成人在线观看 | 97视频一二区 | 一级黄色欧美 | 精精国产xxxx视频在线播放7 | 久久久久久久久久久久免费 | 国产一区二区视频观看 | 成人在线观看一区 | 国产1区2区3区中文字幕 | 国产精品一区二区日韩 | 欧美日韩亚洲一区二区三区 | 色淫湿视频 | 999久久久精品视频 欧美日韩网站在线观看 | 国产91porn| 久操免费在线视频 | 毛片毛片免费看 | 日本精品一区二区 | 在线播放一区二区三区 | 久久久国产精品电影 | xvideos korean| 福利在线影院 | 午夜小影院 | chinesexxxx刘婷hd 国产91在线播放九色 | 国产亚洲精品久久777777 | 一边吃奶一边插下面 | 中文字幕www. | 国产盼盼私拍福利视频99 | 91久久精品一区二区 | h视频免费观看 | 精品国产一区二区三区四区阿崩 | 可以看毛片的网址 | 色欲香天天天综合网站 |