Object.defineProperty

這個方法是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的底層實現。即便平時本身使用也很方便。

相關文章
相關標籤/搜索