1. 程式人生 > >對象(三)——屬性類型,get/set方法

對象(三)——屬性類型,get/set方法

表示 method table enume 函數 tab value num 不能

屬性類型

1. 數據類型

  • Configurable:
    true|false,表示能否通過delete將屬性刪除,默認為true。當把屬性的Configurable設置為false後,該屬性不能通過delete刪除,並且也無法再將該屬性的Configurable設置回true.

  • Enumerable:true|false。表示屬性可否被枚舉,默認true。

  • Writable:true|false。表示屬性是否可寫,默認true

  • Value: 屬性的值

2.訪問器屬性

  • Configurable:
    true|false,表示能否通過delete將屬性刪除,默認為true。當把屬性的Configurable設置為false後,該屬性不能通過delete刪除,並且也無法再將該屬性的Configurable設置回true.

  • get:function(){} 屬性被讀取的時候調用

  • set:function(newValue){} 屬性被寫入的時候調用

  • Value: 屬性的值

3.相關函數

  • Object.defineProperty
    數據屬性和訪問器屬性可以通過Object.defineProperty進行設置
var person={name:”Leo”}
Object.defineProperty(person,”name”,{//設置數據屬性
    Writable:false;//設置為false,name屬性為只讀的
    Configurable:false //設置為false,則name屬性不能通過delete刪除
});
Object.defineProperty(person,”name”,{//設置訪問器屬性
    Configurable:false,
    set:function(newValue){console.log(newValue),name=newValue;}
});

不可同時設置==數據屬性==和==訪問器屬==性如:writable和set:function(){}

在調用Object.defineProperty()方法時,如果不指定,configurable,enumerable和writable特性默認值都為false。

一旦設置configurable:false,將不可再變回可配置

  • Object.defineProperties
    作用跟Object.definePropert一樣,只不過Object.definePropert只能定義單個屬性,而Object.defineProperies可以定義多個屬性
var person={name:”Leo”,age:18} 
Object.defineProperties(person,{
    name:{
        Writable:true
    },
    age{
        set:function(newValue){console.log(newValue)}
    }
});
  • Object.getOwnPropertyDescriptor
Object.getOwnPropertyDescriptor方法。以上面的person為例來使用
var descriptor=Object.getOwnPropertyDescriptor(person,”name”);//得到object對象,包含4個特性鍵值
console.log(descriptor.Value);
console.log(descriptor.Writable);

技術分享圖片
==註意最後一條==

get/set方法

var man = {
    weibo:‘@ydt‘,
    _age:null,
    get age(){
        if(this._age == undefined){
            return new Date().getFullYear()-1998;
        }else{
            return this._age;
        }
    },
    set age(val){
        val = +val;//嘗試轉為數字類型
        if(!isNaN(val)&&val>0&&val<150){
            this._age = +val;
        }else{
            throw new Error(‘Incorrect val=‘ + val);
        }
    }
}

console.log(man.age);//27
man.age = 100;
console.log(man.age);//100
man.age = ‘abc‘;//error:Incorrect val = NaN

上例中,_age和weibo為數據屬性,age為訪問器屬性

對象(三)——屬性類型,get/set方法