訂閱JavaScript對象改變

題記:很多古老的框架或者為了兼容老版本的瀏覽器都是通過set的方法或者臟檢查來通知訂閱者。隨著技術(shù)的發(fā)展最新的框架為了實現(xiàn)綁定通過Object.defineProperty來訂閱對象的改變,其中Object.observe是ES7規(guī)范提案中的,不確定會不會被干掉。


Object.defineProperty

  Object.defineProperty(object, propertyname, descriptor)
參數(shù)

object: 定義的對象
propertyname:參數(shù)名稱
descriptor:定義的描述信息

descriptor
參數(shù)的鍵 描述 默認值
configurable 屬性能否被刪除或者重新定義 false
enumerable 遍歷對象的時候?qū)傩允欠窨梢?/td> false
value 屬性值,當(dāng)設(shè)置后不能設(shè)置getset undefind
writable 屬性能否改變
get 當(dāng)獲取屬性的時候觸發(fā) undefind
set 當(dāng)設(shè)置屬性的時候觸發(fā) undefind

資料說writable默認值為false,但是當(dāng)不設(shè)置這個參數(shù)的時候,value是可以改變的,持懷疑態(tài)度,求解

  var user={};
  Object.defineProperty(user, 'name', {
        get:()=>{
            console.log(`get value:${this.name}`)
            return this.name;
        },
        set:value=>{
            console.log(`set value:${value}`)
            this.name=value;
        }
  });

注:下面設(shè)置會拋出異常

  var user={};
  Object.defineProperty(user, 'name', {
        value:'johe',
        get:()=>{
            console.log(`get value:${this.name}`)
            return this.name;
        },
        set:value=>{
            console.log(`set value:${value}`)
            this.name=value;
        }
  });
  //Uncaught TypeError: Invalid property descriptor. 
  //Cannot both specify accessors and a value or writable attribute, #<Object>

Object.defineProperties

Object.defineProperties(object, props)
參數(shù)

object: 定義的對象
props: 添加的屬性, keyvalue 分別Object.defineProperty 中的第二和第三個參數(shù)。

Object.observe

  Object.observe(object, callback, acceptList)
  Object.unobserve(object,callback)
參數(shù)

object: 定義的對象
callback:參數(shù)修改后的回掉
acceptList:設(shè)置訂閱屬性的操作類型:["add", "update", "delete", "reconfigure", "setPrototype", "preventExtensions"],當(dāng)為null的時候是全部

var user={};
Object.observe(user,info=>{console.log(info)});

user.baz=2;
//{"type":"add","object":{},"name":"baz"},

user.baz=3;
//{"type":"update","object":{},"name":"baz","oldValue":2}

delete user.baz;
//{"type":"delete","object":{},"name":"baz","oldValue":3}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容