一個函數誕生一個框架!
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。
這個屬性起到兩個作用:
-
目標屬性是否可以使用delete刪除
-
目標屬性是否可以再次設置特性
上面的栗子拿下來再看一下:
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一樣,都由它管理起來,剩下的我們就可以爲所欲爲了!