数据属性
数据属性包含一个数据值的位置,在这个位置可以读取和写入值。
数据属性4个描述其行为的特性
[[Configurable]]:表示能否通过delete删除属性或重新定义属性,能否修改特性(特性默认值true,修改成false之后将不能修改任何特性),能否把属性修改为访问器属性。
[[Enumerable]]:表示能否通过for-in循环返回属性。特性默认值true
[[Writable]]:表示能否修改属性的值。特性默认值true
[[Value]]:包含这个属性的数据值,读取属性值得时候,从这个位置读,写入属性值的时候,把新值保存在这个位置。这个特性默认值undefined创建一个名name的属性,它的值为‘狡兔三窟’,这个时候特性Value被设置为‘狡兔三窟’。
修改属性默认特性
ECMAScript提供了一个修改属性默认特性的方法。
Object.defineProperty( )方法,这个方法接收三个参数:属性所在对象,属性名、描述符(即上面四个描述属性行为的特性)。
var person={name:'狡兔三窟'}
Object.defineProperty(person,'name',{writable:false,value:'狡兔三窟'})
Object {name: "狡兔三窟"}
person.name=666 //将对象person的属性name设为666.失败
666
person.name //还是原来的值'狡兔三窟', 修改了属性的特性,设为不可以修改属性值。
"狡兔三窟"
var person={name:'狡兔三窟'}
undefined
Object.defineProperty(person,'name',{configurable:false,value:'狡兔三窟'})//configurable设为false,该对象属性将不能被删除,也不能重新修改特性,一旦将属性设置为不可配置它将设置不回来。
Object {name: "狡兔三窟"}
delete person.name
false //使用Object.defineProperty()方法创建新属性时,不设置特性,那么它们的特性默认值为false。没有必要用这个方法创建新属性。
var c={};
Object.defineProperty(c,'name',{
delete c.name
///false 用Object.defineProperty() 创建的新属性,其属性特性都为false。
访问器属性
访问器属性不包含数据值,它包含一对getter和setter函数,在读取访问器属性时,调用getter函数,返回属性的值。在写入访问器属性时会调用setter函数并传入新值。
[[Configurable]]:表示能否通过delete删除属性或重新定义属性,能否修改特性(特性默认值true,修改成false之后将不能修改任何特性),能否把属性修改为访问器属性
[[Enumerable]]:表示能否通过for-in循环返回属性。特性默认值true.
[[Get]]:在读取属性时调用函数。默认值为undefined;
[[Set]]:在写入属性时调用函数。默认值为undefined;
访问器属性不能直接定义,跟数据属性一样要通过Object.defineProperty()方法来定义访问器属性。
var person={date:2018,edition:1};
Object.defineProperty(person,'_date',{ //为person创建一个访问器属性
get:function(){ //读取person._date时调用get函数,返回this.date(2018). this值是person对象
return this.date;
},
set:function(value){ //修改person._date属性值的时候调用set函数。
if(value>2018){ //如果在写入的属性值大于2018,date的值会改变同时edition属性值也会改变。
this.deta=value; //注意_date和date是不同的。_date是访问器属性。
this.edition+=value-2018
}
}
})
person._date=2019;
person.edition //edition变成了2 设置一个属性导致另一个属性发生变化.
设置访问器属性的时候不设置getter会导致该属性不能读,同样的不是设置setter会导致属性不能写。
定义多个属性
ECMAScript5 定义了一个Object.defineProperties()方法。可以利用这个方法一次性定义多个属性的特性。
接收两个参数需要设置特性的属性的对象。第二个参数用{要设置特性的属性}
var person={}; //空对象
Object.defineProperties(person,{ //创建多个定义属性
date:{ //创建date属性和editon属性,其configurable、enumerable默认为false。只设置了writable为false。只能修改值
writable:true,
value:2018
},
edition:{
writable:true,
value:1
},
_date:{ //创建一个_date访问器属性
get:function(){
return this.date;
},
set:function(value){
if(value>2018){
this.date=value;
this.edition+=value-2018;
}
}
}
})
读取属性的特性
Object.getOwnPropertyDescirptor()方法,可以取得给定属性的特性的值,这个方法接收两个参数。第一个是属性的对象,第二个是要取得描述符的属性。返回值是一个对象,如果是访问器属性,这个对象的属性(特性)有configuerable,enumerable,get,set。如果是数据属性,这个对象的属性有configurable,writable,enumerable,value。get、set、value 默认值undefined。