Object.defineProperty 詳解

最近想了解一下Vue是怎麼實現數據雙向綁定的,瞭解到是基於Object.definProperty,在此記錄一下。javascript

Object.defineProperty  顧名思義,就是給對象定義一個屬性,總共有這麼幾種:java

  • value  屬性的值
  • writable  是否可改寫,若是爲false,就爲只讀,不能從新賦值,和const差很少
  • enumerable  可否枚舉,若是設置爲false則不能在for……in中出現  
  • configurable   ’配置‘,顧名思義,一旦爲false,就不能再設置他的(value,writable,configurable)
  • 不能同時設置訪問器 (get 和 set) 和 wriable 或 value,不然會錯,就是說(get 和 set)和(wriable 或 value中的任何一個)只能取其一this

  • get  讀取時調用這個方法
  • set  賦值時調用這個方法

 隨便寫點東西spa

<script>
    var c = {
        year:2017
    };
    Object.defineProperty(c,'a',{
     // 注意這裏不能直接不能對a直接賦值,不然會無限回調 set:
function(val){console.log(`I set the value ${val}`);}, get:function(){return this} }) </script>

 分別賦值和取值:雙向綁定

 

set的時候正確的調用了方法,可是取值的時候若是寫return this.acode

就會報錯,棧溢出。看上面的圖咱們就明白了,a的值指向自身,若是直接打印就會無限回調,雖然咱們不能取到a,但咱們能經過a取到其餘屬性對象

修改get:blog

set:function(val){
	this.year = val
},
get:function(e){
	return this.year
}

  

 

相關文章
相關標籤/搜索