JS中的屬性描述對象 4

存取器(accessor)

除了直接定義以外,屬性還可以用存取器(accessor)定義。其中,存值函數稱為setter,使用set命令;取值函數稱為getter,使用get命令

存取器提供的是虛擬屬性,即該屬性的值不是實際存在的,而是每次讀取時計算生成的。利用這個功能,可以實現許多高級特性,比如每個屬性禁止賦值。

var o = {
  get p() {
    return 'getter';
  },
  set p(value) {
    console.log('setter: ' + value);
  }
};

上面代碼中,o對象內部的get和set命令,分別定義了p屬性的取值函數和存值函數。定義了這兩個函數之后,對p屬性取值時,取值函數會自動調用;對p屬性賦值時,存值函數會自動調用。

o.p // "getter"
o.p = 123 // "setter: 123"

注意,取值函數Getter不能接受參數,存值函數Setter只能接受一個參數(即屬性的值)。另外,對象也不能有與取值函數同名的屬性。比如,上面的對象o設置了取值函數p以后,就不能再另外定義一個p屬性。

存取器往往用于,屬性的值需要依賴對象內部數據的場合。

var o ={
  $n : 5,
  get next() { return this.$n++ },
  set next(n) {
    if (n >= this.$n) this.$n = n;
    else throw '新的值必須大于當前值';
  }
};

o.next // 5

o.next = 10;
o.next // 10

上面代碼中,next屬性的存值函數和取值函數,都依賴于對內部屬性$n的操作。

存取器也可以通過Object.defineProperty定義。

var d = new Date();

Object.defineProperty(d, 'month', {
  get: function () {
    return d.getMonth();
  },
  set: function (v) {
    d.setMonth(v);
  }
});

上面代碼為Date的實例對象d,定義了一個可讀寫的month屬性。

存取器也可以使用Object.create方法定義。

var o = Object.create(Object.prototype, {
  foo: {
    get: function () {
      return 'getter';
    },
    set: function (value) {
      console.log('setter: '+value);
    }
  }
});

如果使用上面這種寫法,屬性foo必須定義一個屬性描述對象。該對象的get和set屬性,分別是foo的取值函數和存值函數。

利用存取器,可以實現數據對象與DOM對象的雙向綁定。

Object.defineProperty(user, 'name', {
  get: function () {
    return document.getElementById('foo').value;
  },
  set: function (newValue) {
    document.getElementById('foo').value = newValue;
  },
  configurable: true
});

上面代碼使用存取函數,將DOM對象foo與數據對象user的name屬性,實現了綁定。兩者之中只要有一個對象發(fā)生變化,就能在另一個對象上實時反映出來。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 136,628評論 19 139
  • 概述 JavaScript提供了一個內部數據結構,用來描述一個對象的屬性的行為,控制它的行為。這被稱為“屬性描述對...
    zjh111閱讀 785評論 0 0
  • 概述 JavaScript提供了一個內部數據結構,用來描述一個對象的屬性的行為,控制它的行為。這被稱為“屬性描述對...
    許先生__閱讀 563評論 0 1
  • 函數和對象 1、函數 1.1 函數概述 函數對于任何一門語言來說都是核心的概念。通過函數可以封裝任意多條語句,而且...
    道無虛閱讀 4,957評論 0 5
  • 個人觀點:不管是本格派、社會派、變格派、冷硬派.......只要帶給自己閱讀上的享受,思想上的啟悟,思維模式的進步...
    xblzbjs閱讀 631評論 0 2

友情鏈接更多精彩內容