JavaScript getter和setter

  對象的屬性是由屬性名name,值key,和其餘特性(可讀寫性 writable,可枚舉性enumerable,可配置性configurable)組成的。從ES5開發,提供了getter和setter 能夠將屬性值的獲取和設置分別綁定到方法上,稱之爲「存取器」。有了getter和setter咱們就可以在屬性值的變動和獲取時實現一些操做。函數

簡單的getter , setter

  直接在對象中建立屬性的getter和setter,並進行測試。性能

  注意語法規則,是經過get和set關鍵字建立的percent屬性的getter和setter函數。get函數是沒有參數的,set函數會將等號右邊的值做爲參數。當訪問percent屬性時,會返回_num加%,當設置percent時,會打印日誌並將值賦給_num。測試

使用defineProperty

  如何在已有的對象上添加getter和setter呢?   Object.defineProperty(obj, prop, descriptor) ,obj爲將要操做的對象,prop是將要定義或者修改的屬性名,descriptor是將要被修改或者定義的描述符。看實例this

  

  defineProperty()添加或者修改屬性的時候須要注意:spa

    一、數據描述符configurable標誌着該屬性可以被改變,可以被刪除,默認爲false日誌

    二、數據描述符enumerable標誌着該屬性是否可枚舉,默認爲false。只有可枚舉屬性纔會在for in中遍歷,Object.keys()中返回。另外,全部的內置方法都是不可枚舉的,eg:toStringcode

    三、數據描述符value默認爲undefined,writable默認爲false。因此defineProperty默認新增的屬性,是不能夠被賦值運算符修改的。對象

    四、存取描述符set和get都默認爲undefinedblog

    五、set/get是不可以和value或者writable一塊兒用的,由於當是存取器屬性的時候,當設置了set標誌着可寫,設置了get就標誌着可讀,而value也是經過get函數返回的,因此不能同時使用。ip

Class中的 getter setter

  ES6新增class的概念,改變了構造對象的書寫方式,class中一樣能夠設置存取器。

 

TypeScript中的 getter和setter

   Angular項目中使用的是ts,ts的class語法與ES6的稍有不一樣,經過項目中的一個小栗子記錄下ts中的getter和setter。場景以下,有一個datepicker組件,能夠調整時間級別爲5分鐘或者天。不一樣級別時,datepicker組件須要做出不一樣的調整。

 

  作以下處理: datepicker組件中有@input來接受級別的調整,在set中作一些操做

export class LdatepickerComponent implements OnInit { public _level: Level = 'minite'; @Input() get level (): Level { return this._level; } set level ( value: Level ) { // 修改級別後 重置組件的狀態
 doSomething() // 發送新的時間爲0
 doOther() this._level = value; } }

  當選擇不一樣的級別時,傳入到datepicker組件的level會變化,此時的set會對組件作一些自定義的操做,實現需求。

相關文章
相關標籤/搜索