這個方法是es5中新增的方法,以前沒了解過,粗略的看了一下也沒發現什麼特別的用處。而後今天仔細的研究了一下,發現這個方法簡直是本身造輪子的必要的方法。框架
先放最簡單的代碼示例:學習
var John = {}; Object.defineProperty(John,"age",{ value: 23 }) console.log(John.age); //23
我剛開始看到這種例子的時候。。個人心裏也是絕望的,這es5新出的都是什麼,這幹嗎不直接John.age = 23不就完事了麼。而後我就把頁面關掉了。。(不要怪我沒耐心,我當時確實沒上什麼心。。)es5
好了,開始正式介紹這個方法。spa
defineProperty方法總共須要傳入三個參數。第一個目標對象,第二個屬性名稱,第三個是特性descriptor。code
第一第二個不用說,第三個中間又分以下幾個值:對象
value: 屬性對應的值blog
writable: 若是爲false,屬性的值不可變ip
configurable 若是爲false,該對象的全部desriptor均不可變(包括賦值)字符串
enumerable 是否能在for..in..循環中被遍歷出來(感受像是是否public的感受)get
get/set 這兩個是重點,也就是我對這個方法推崇,以及認爲必需要學習記住的緣由。
下面詳細闡述get、set方法:
在descriptor中不能同時設置訪問器(get和set)和wriable或value,不然會錯,就是說想用get和set,就不能用writable或value中的任何一個。
var John = {} Object.defineProperty(John,"nickName",{ set:function(newValue){ console.log("我新的暱稱是"+newValue); }, get:function(){ console.log("有人問了/看了個人暱稱"); return "二狗子"; // 這裏我隨意返回了一個字符串 } }) John.nickName = "哈哈"; // 我新的暱稱是哈哈 console.log(John.nickName); // 有人問了/看了個人暱稱 // 二狗子
好吧其實東西很少,可是這個方法就是各類框架中的observe的底層實現。即便平時本身使用也很方便。