天天看點

淺談Javascript資料屬性與通路器屬性

ES5中對象的屬性可以分為‘資料屬性’和‘通路器屬性’兩種。

  資料屬性一般用于存儲資料數值,通路器屬性對應的是set/get操作,不能直接存儲資料值。

  資料屬性特性:value、writable、enumerable、configurable。

    解釋:configurable:true/false,是否可以通過delete删除屬性,能否修改屬性的特性,能否把屬性修改為通路器屬性,預設false;

       enumerable:true/false,是否可以通過for in循環傳回,預設false;

       writable:true/false,是否可以修改屬性的值,預設false;

       value:undefined,設定屬性的值,預設undefined。

   通路器屬性特性:set、get、enumerable、configurable。

     解釋:configurable:true/false,是否可以通過delete删除屬性,能否修改屬性的特性,能否把屬性修改為通路器屬性,預設false;

        enumerable:true/false,是否可以通過for in循環傳回,預設false;

        set:function,讀取屬性值時調用的函數;

        get:function,修改屬性值時調用的函數。

  将屬性添加到對象或修改現有屬性的特性使用Object.defineProperty() 或 Object.defineproperties()方法;

    Object.defineProperty(object, propertyname, descriptor):

    參數解釋:object:需要添加或修改屬性的對象;

         propertyname:屬性的名稱,字元串格式;

         descriptor:屬性的描述,設定資料屬性或通路器屬性的特性。

  執行個體分析:

  資料屬性:

    var emp = {

      name:'tom'

    };

    Object.defineProperty(emp,'name',{

      writable:false

    });

    emp.name = 'jery';

    console.log(emp.name);//輸出tom,因為已經設定了writable為false

      

    Object.defineProperty(emp,'age',{

      configurable:false,

      writable:true,

      value:22

    console.log(emp.age);//輸出22,因為設定了value為22

    emp.age = 25;

    console.log(emp.age);//輸出25,設定了writable為true

    delete emp.age;

    console.log(emp.age);//輸出25,設定了configurable為false,此屬性删除不了

  通路器屬性:

    var emp ={

      _name:'tom',

      _age:20

    

      get:function(){

          return this._name;

        }

    console.log(emp.name);//輸出tom,由get方法傳回_name的值

    console.log(emp.name);//輸出tom,沒有set方法,修改不了_name的值 

      configurable:true,

        return this._age;

      }

      set:function(age){

        this._age = age;

    emp.age = 25;  

    console.log(emp.age)//輸出25,emp.age=25是使用set方法将25指派給_age,emp.age是使用get方法将_age的讀取出來

    console.log(emp.age);//輸出undefined,configurable為true,可以使用delete方法将emp.age屬性删除

繼續閱讀