JavaScript基础知识整理(对象的属性)

对象的定义

无序属性的集合,属性可以包括基本值,对象或函数。

JavaScript中有两类属性,数据属性和访问器属性。

特征值

JavaScript使用特征值来描述属性的行为,因为是为实现JavaScript引擎用的,所以不能直接访问。

数据属性有4个特性:[[Configurable]]、[[Enumerable]]、[[Writable]]和[[Value]]。

[[Configurable]]表示能否通过delete删除属性,能否修改属性的特性,能否把属性修改为访问器属性,默认为true。

[[Enumerable]]表示能否使用for-in循环返回属性,默认为true。

[[Writable]]表示能否修改属性的值,默认为true。

[[Value]]包含着属性的值,读取属性值时从这里读,写入属性值时从这里写,默认为undefined。

 

可以使用Object.defineProperty()来修改属性的特性,这个函数接收3个参数:属性所在对象,属性名,描述符对象。

var person = {};
Object.defineProperty(person,"name",{
        writable:false,
        value:"tony"  
} 
alert(person.name)//Tony
person.name = "sam";
alert(person.name)//Tony   因为writable设置为false所以不能修改值

 

访问器属性没有数据值,相对的有setter()和getter()函数,读取属性值时调用getter(),写入属性值时调用setter()。

访问器属性也有4个特性:[[Configurable]]、[[Enumerable]]、[[Get]]和[[Set]]。

[[Configurable]]表示能否通过delete删除属性,能否修改属性的特性,能否把属性修改为访问器属性,默认为true。

[[Enumerable]]表示能否使用for-in循环返回属性,默认为true。

[[Get]]读取属性时调用的函数,默认为undefined。

[[Set]]写入属性时调用的函数,默认为undefined。

访问器属性不能直接定义,必须用Object.defineProperty()定义。

var book = {
      _year:2000,
     edition:1
}    
Object.defineProperty(book,"year",{
      get:function(){
           return this._year;        
      } 
      set:function(newyear){
           if(newyear > 2000){
                 this._year = newyear;
                 this.edition = newyear - 2000
          }
    } 
});    
book.year = 2001;
alert(book.edition);//2

定义多个属性

当要定义多个属性时可以用Object.defineProperties(),接收两个参数,要添加属性的对象以及由想要添加属性组成的对象。

var book = {};
Object.defineProperties(book,{
        _year:{
                writable:true,
                value:2000
        },
       edition:{
               writable:true,
               value:1
       },
       year:{
               get:function(){
                      return this._year;
               },
               set:function(newyear){
                      if(newyear > 2000){
                             this._year = newyear;
                             this.edition = newyear - 2000;
                      }
               }
       }
});                            

读取属性的特性

想要获得属性的特性值可以用Object.getOwnPropertyDescriptor()方法,接收两个参数,属性所属的对象,属性名称,返回一个包含特性值的对象。

var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
alert(descriptor.value);//"2000"
var descriptor1 = Object.getOwnPropertyDescriptor(book,"year");
alert(descriptor.value);//"undefined"

 

 

posted @ 2020-06-12 16:48  裏Arashi  阅读(130)  评论(0编辑  收藏  举报