【js学习笔记-036】--属性的特性

来源:互联网 发布:淘宝上买狗狗可靠吗 编辑:程序博客网 时间:2024/06/14 13:40

数据属性的4个特性:值,可写性,可枚举性,和可配置性

存取器的4个特性:读取,写入,可枚举和可配置性

为了实现属性特性的查询和设置操作,ECMAScript 5 定义了一个名为”属性描述符”的对象,这个对象代表4个特性。描述符对象和它所描述的属性特性同名,因此,数据属性的描述符对象的属性有value,writable,enumerable和configurable.

存取器属性的描述符对象则用get属性和set属性代替value,writable。writable,enumberable和configurable是布尔值。当然get属性和set 属性是函数值

 

通过Object.getOwnPropertyDescriptor()只能得到自有属性的描述符。要想获取继承属性的特性,需要遍历原型链getPrototypeOf(),要想设置属性的特性,或者想新建属性具有某种特性,则需要调用Object.defineProperty();

var o = {}

Object.defineProperty(o,”x”,{

   value:1,writable:true,

   enumberable:true,

   configurable:true

})

以上,属性存在但不可枚举。

o.x //=>1

Object.key(o)//=>[]

//现在对属性做修改,使其只读

Object.defineProperty(o,”x”,{writable:false});

 

//试图更改这个属性值

o.x = 2; //操作失败但不报错是,而在严格模式中会抛出类型错误异常

//属性依然可配置,因此可以通过这种方式对它进行修改

Object.defineProperty(o,”x”,{value:2});

//现在将x从数据属性改为存取器属性:

Object.defineProperty(o,”x”,{get:function{return0;}});

o.x ; //=>0

注意:要么修改已有属性,要么新建自有属性,但不能修改继承属性

要修改一个对象的多个属性可以使用Object.defineProperties(),每一个参数是要修改的对象,第二个一个映射表,它包含要新建或修改的属性名称,以及它们的属性描述符。

getter和setter的老式 API

在ECMAScript 5采纳之前,大多数javascript的实现(除IE),已经支持对象直接量语法中的get set。

__lookupGetter__()和__lookupSetter__()用以返回一个命名属性的getter和setter方法。

__defineGetter__()和__defineSetter__()用以定义getter和setter方法。第一个参数是属性名,第二个参数是getter 和setter方法

 

原创粉丝点击