ECMAScript属性类型

数据属性

数据属性包含一个数据值的位置,在这个位置可以读取和写入值。

数据属性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函数并传入新值。


访问器属性有4个描述其特性:

[[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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值