徹底理解vue底層運用的核心函數Object.defineProperty

    一個函數誕生一個框架!

    vue就是得益於javaScrit的原生函數Object.defineProperty而誕生的。

    那麼Object.defineProperty到底是什麼?它的用法又是怎樣的呢?

很簡單,它就是用來爲對象定義屬性的。(從字面上就能理解)

既然是一個方法,那就要有:

語法:

Object.defineProperty(obj, prop, descriptor)

參數:

obj:必需。目標對象(要操作的對象,爲這個對象定義屬性)
prop:必需。需定義或修改的屬性的名字
descriptor:必需。目標屬性所擁有的特性

舉個栗子:

var lala={};

Object.defineProperty(lala, "hehe", descriptor);

執行完之後我們 lala就有了hehe這個屬性,我們就可以這樣使用了lala.hehe。

下面我們就來說第三個參數descriptor:

descriptor這個是用來定義我們自定義屬性(這裏以上面例子中的hehe爲例)hehe的特性。

我們看看我們能夠定義hehe的特性有哪些?

value  屬性對應的值,可以使任意類型的值,默認爲undefined

writable  屬性的值是否可以被重寫。設置爲true可以被重寫;設置爲false,不能被重寫。默認爲false。

enumerable  此屬性是否可以被枚舉(使用for...in或Object.keys())。設置爲true可以被枚舉;設置爲false,不能被枚舉。默認爲false。

configurable  是否可以刪除目標屬性或是否可以再次修改屬性的特性(writable, configurable, enumerable)。設置爲true可以被刪除或可以重新設置特性;設置爲false,不能被可以被刪除或不可以重新設置特性。默認爲false。

這個屬性起到兩個作用:

  1. 目標屬性是否可以使用delete刪除

  2. 目標屬性是否可以再次設置特性

上面的栗子拿下來再看一下:


Object.defineProperty(lala,"hehe",{
    value:"hello",
    writable:false,
    enumerable:false,
    configurable:false
});

這就是此方法的應用!

下面說說它在vue(angularjs也用到了)中的應用的一個特性:

存取器描述

我們要這麼應用:

Object.defineProperty(lala,"hehe",{
    get:function (){} | undefined,
    set:function (value){} | undefined
    configurable: true | false
    enumerable: true | false
});

對你沒看錯  ,就是get和set方法。

get  方法在獲取值的時候觸發

set  方法在設置值的時候觸發 

也就是說我們完全監聽到屬性值的動態  在獲取或者設置值(就是我們定義hehe的值)的時候我們可以做任何事情,那麼數據雙向綁定就很好實現了。

理解了這個之後  我們就能理解vue爲什麼要將dom(vue裏面的vm.$refs)管理起來,就行spring一樣,都由它管理起來,剩下的我們就可以爲所欲爲了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章