属性的特性

 ECMAScript3中无法设置这些特性,所有通过ECMAScript3的程序创建的属性都是可写的,可枚举的和可配置的,无法对这些特性做修改,

ECMAScript5可以查询和设置这些属性特性的api,

可以通过些api给原型对象添加方法,并将它们设置成不可枚举的,这让它们看起来更像内置方法,

可以通过这些api给对象定义不能修改或删除的属性,借比"锁定"这个对象

存取器属性的getter和setter方法看成是属性的特性,也可以把数据属性的值同样看做属性的特性.因此,可以认为一个属性包含一个名字和4个特性,数据属性的4个特性分别是它的值(value),可写(writable),可枚举(enumerable)和可配置性(configurable),存取器属性不具有值(value)特性和可写性,它们的可写性是由setter方法存在与否决定的.

调用object.getOwnPropertyDescriptor()可以获取某个对象特定属性的属性描述符
Object.getOwnPropertyDescriptor({x:1},"x");
//返回{value:1,writable:true,enumerable:true,configurable:true}
Object.getOwnPropertyDescriptor(random,"octet");
//返回{get:/*func*/,set:undefined,enumerable:true,configurable:true}
对于继承属性和不存在的属性,返回undefined
Object.getOwnPropertyDescriptor()只能得到自有属性的描述符,想要获得继承属性的特性,需要遍历原型链
Object.getPrototypeOf().
要想设置属性的特性,或者想让新建属性具有某种特性,则需要调用Object.definePeoperty,传入要修改的对象,
要创建或修改的属性的名称以及属性描述符对象:
var o = {};
Object.defineProperty(o,"x",{value:1,
writable:true,
enumerable:false,
configurable:true});
属性是存在的,但不可枚举
Object.defineProperty(o,"x",{writable:false});
o.x=4;操作失败但不报错.严格模式中抛出类型错误异常
属可以通过这种方式对它进行修改
Object.defineProperty(o,"x",{value:4});
o.x     得到数字4
将x从数据属性修改为存取器属性
Object.defineProperty(o,"x"{get:function(){return 0;}});
o.x     得到零
Object.defineProperty()的属性描述符对象不必包所有特性.对于新创建的属性来说,默认的特性值false或undefined,
对于修改的已有属性来说,默认的特性值没有做任何修改.
这个方法要么修改已有属性要么新建自有属性,但不能修改继承属性
如果要同时修改或他建多个属性,则需要使用object.defineProperties(),第一个参数是要修改的对象,第二个参数是映射表,
var obj = Object.defineProperties({},{
x:{value:1,writable:true,enumerable:true,configurable:true},
y:{value:2,writable:true,enumerable:true,configurable:true},
r:{
get:function(){return Math.sqrt(this.x*this.x+this.y*this.y);},
enumerable:true,
configurable:true
}
});


对于不允许创建或修改的属性,如果用Object.defineProperty()和Object.definePropertise()对其操作就会
抛出类型错误异常,


如果对象是不可扩展的,则可以编辑已有的自有属性.但不能给它添加新属性.
如果属性是不可配置的.则不能修改它的可配置性和可枚举性






















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值