Object.defineProperty的理解

1、Object.defineProperty:給一個對象定義一個新的屬性或修改一個對象現有的屬性,而且返回這個對象數組

1.語法:Object.defineProperty(參數1,參數2,參數3)this

  參數1:目標對象spa

  參數2:須要修改或者添加的屬性名prototype

  參數3:目標對象屬性的一些特徵(是一個對象)code

  其中參數3中也有一些參數:對象

    參數1:value:屬性值blog

    參數2:writable:對象屬性值是否可被修改,true表示容許,false表示不容許繼承

    參數3:configurable:對象屬性是否可被刪除,true爲容許,false爲不容許get

    參數4:enumerable:對象屬性是否可被枚舉(即遍歷)原型

    參數5:get():給一個屬性提供getter方法,當訪問這個對象的屬性值時觸發該方法

    參數6:set():給一個屬性提供setter方法,當設置這個對象的屬性值時觸發該方法

2、參數示例

一、value

  var obj = {};
  Object.defineProperty(obj,"name",{value:"Leslie Cheung"});
  Object.defineProperty(obj,"age",{value:22});
  console.log(obj);//Object(是一個Object對象)

二、writable

    var obj = {};
    Object.defineProperty(obj,"name",{
        value:"Leslie Cheung",
        writable:false//爲false時不容許修改
    })
    obj.name = "leslie-cheung";
    console.log(obj.name);//Leslie Cheung

    var obj = {};
    Object.defineProperty(obj,"name",{
        value:"Leslie Cheung",
        writable:true//爲true時容許修改
    })
    obj.name = "leslie-cheung";
    console.log(obj.name);//leslie-cheung

三、configurable

    var obj = {};
    Object.defineProperty(obj,"name",{
        value:"Leslie Cheung",
        configurable:false//爲false時不容許被刪除
    })
    delete obj.name;
    console.log(obj.name);//Leslie Cheung

    var obj = {};
    Object.defineProperty(obj,"name",{
        value:"Leslie Cheung",
        configurable:true//爲true時容許被刪除
    })
    delete obj.name;
    console.log(obj.name);//undefined

四、enumerable

    var obj = {name:"Leslie Cheung",age:"20"};
    Object.defineProperty(obj,"name",{
        enumerable:false//爲false時不可被遍歷
    });
    Object.defineProperty(obj,"age",{
        enumerable:false//爲false時不可被遍歷
    });
    console.log(Object.keys(obj));//[]

    var obj = {name:"Leslie Cheung",age:"20"};
    Object.defineProperty(obj,"name",{
        enumerable:true//爲true時可被遍歷
    });
    Object.defineProperty(obj,"age",{
        enumerable:true//爲true時可被遍歷
    });
    console.log(Object.keys(obj));//["name", "age"]

五、get()和set()

    var obj = {name:"Leslie Cheung"};
    Object.defineProperty(obj,"name",{
        get(){
            console.log("被訪問,觸發get()方法");//被訪問時觸發get()方法
        },
        set(val){
            console.log("被設置了" + val + ",觸發set()方法");//被設置時觸發set()方法
        }
    });
    obj.name;//輸出結果:被訪問,觸發get()方法
    obj.name = "leslie-cheung";//輸出結果:被設置了leslie-cheung,觸發set()方法
注意:當使用了get()方法或者set()方法的時候就不能使用value和writable中的任何一個屬性不然會報錯

六、for in和Object.keys()的區別

    function Person(name,age){
        this.name = name;
        this.age = age;
    }
    Person.prototype = {
        sex:"男"
    }
    var man = new Person("Leslie Cheung",20);
    console.log(Object.keys(man));//["name", "age"],返回一個數組,數組值爲對象自身的屬性,不包括繼承原型的屬性
    for(var key in man){
        console.log(key);//name age sex,遍歷對象可枚舉的屬性,包括自身的屬性,以及繼承原型的屬性
    }
相關文章
相關標籤/搜索