ECMA-262第五版在定义时,描述了属性property的各种特征,定义这些特性是为了实现javascript引擎用的,为了表示该特性是内部值,规范把它们放在了两对儿方括号中,例如[[Enumerable]]。我们参考第五版描述。

ECMAScript中有两种属性:数据属性和访问器属性。

  数据属性

数据属性包含一个数据值的位置,在这个位置可以读取和写入。该属性有4个描述其行为的特性。

[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性特性,或者能否把属性修改为访问器属性。我们通常直接在对象上定义属性,这个特性默认值为true。

[[Enumerable]]:表示能否通过for-in循环返回属性。我们通常直接在对象上定义的属性,默认值为true。

[[Writable]]:表示能否修改属性的值。我们通常直接在对象上定义的属性,默认值为true。

[[Value]]:包含这个属性的数据值。读取值从这里读,写入也把新值保存在这里。这个特性默认值为undefined。

要修改属性默认的特性,必须使用ECANScript5的Object.defineProperty()方法。

这个方法接收三个参数:属性所在对象,属性名称,一个描述符对象。

描述符对象的属性必须是 configurable,enumerable,writable,value。设置其中一个或多个值,可以修改对应的特性。

  var person = {};

 Object.defineProperty(person,'name',{
writable: false,
value: 'jack'
}); alert(person.name); // 'jack'
person.name = 'Tom';
alert(person.name); // 'jack'

这个例子创建了一个person对象,并为其创建了一个name属性,它的值'jack'是只读的,不可修改的。如果尝试为它指定新值,在非严格模式下会被忽略,严格模式下,会抛出错误。

注意:如果把configurable属性设置为false,表示无法对属性删除,重新定义,修改等。如果对这个属性调用delete,非严格模式下没什么发生,严格模式下会导致错误。而且,一旦把属性定义为不可配置,就再不能把他变回可配置了。此时在调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误:

 var person = {};
Object.defineProperty(person,'name',{
configurable: false,
value: 'Tom'
}); //抛出错误
Object.definProperty(person,'name'{
configurable: true,
value: 'Tom'
});

访问器属性

访问器属性不包含数据值,它们包含一对儿getter和setter函数(这两个函数都不是必须的)。

读取调用getter,写入调用setter。

访问器属性有如下四个特性

[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性特性,或者能否把属性修改为访问器属性。我们通常直接在对象上定义属性,这个特性默认值为true。

[[Enumerable]]:表示能否通过for-in循环返回属性。我们通常直接在对象上定义的属性,默认值为true。

[[Get]]:在读取属性时调用函数。默认值为undefined。

[[Set]]:在写入属性时调用函数。默认值为undefined。

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

 var book = {
_year = 2004,
edtion: 1
}
Object.defineProperty(book,'year',{
get: function(){
return this._year;
},
set: function(newValue){
if(newValue > 2004){
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition); //

以上代码给book对象定义了两个默认属性:_year和edition。_year表示通过对象访问方法访问属性。

而访问器属性year包含getter和setter函数。getter函数返回_year的值,setter计算正确的版本。修改year为2005会导致_year变成2005。edition变为2.这是使用访问器属性的常见方式。

在不支持Object.defineProperty()方法的浏览器中不能修改[[Configurable]]和[[Enumerab]]。

javascript对象属性——数据属性和访问器属性的更多相关文章

  1. JavaScript中的数据属性和访问器属性

    在学习JavaScript原型(prototype)和原型链(prototype chain)知识的时候,发现数据属性和访问器属性的重要性,通过不断的查找相关知识,浅显理解如下,若有差错,希望不吝赐教 ...

  2. js对象的数据属性和访问器属性

    js面向对象 ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征.ECMA-262定义这些特性是为了实现javascript引擎用的,因此 ...

  3. JS的数据属性和访问器属性

    ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征.ECMA-262定义这些特性是为了实现javascript引擎用的,因此在javasc ...

  4. JavaScript 数据属性和访问器属性

    在JavaScript中对象被定义为"无序属性的集合,其属性可以包含基本值.对象或函数."通俗点讲,我们可以把对象理解为一组一组的名值对,其中值可以是数据或函数. 创建自定义对象通 ...

  5. JavaScript 属性类型(数据属性和访问器属性)

    数据属性 数据属性包含一个数据值的位置.在这个位置可以读取和写入值.数据属性有 4 个描述其行为的特性. [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修 ...

  6. JavaScript数据属性与访问器属性

    ES5中对象的属性可以分为‘数据属性’和‘访问器属性’两种. 数据属性一般用于存储数据数值,访问器属性对应的是set/get操作,不能直接存储数据值. 数据属性特性:value.writable.en ...

  7. 浅谈Javascript数据属性与访问器属性

    ES5中对象的属性可以分为‘数据属性’和‘访问器属性’两种. 数据属性一般用于存储数据数值,访问器属性对应的是set/get操作,不能直接存储数据值. 数据属性特性:value.writable.en ...

  8. Js中的数据属性和访问器属性

    Js中的数据属性和访问器属性 在javaScript中,对象的属性分为两种类型:数据属性和访问器属性. 一.数据属性 1.数据属性:它包含的是一个数据值的位置,在这可以对数据值进行读写. 2.数据属性 ...

  9. js中属性类型:数据属性与访问器属性

    js中属性类型分为两种:数据属性和访问器属性 在js中,对象都是由名值对构成的,名:就是我们所说的属性名,值就是属性对应的值(基本值.对象.方法). ECMA-262第5版定义了只有内部才用的特性,描 ...

随机推荐

  1. hdu 3530 Subsequence 单调队列

    题目链接 题目给出n个数, 一个下界m, 一个上界k, 让你求出最长的一段序列, 满足这段序列中的最大的数-最小的数<=k&&>=m, 输出这段长度. 可以维护两个队列, ...

  2. mysql常见错误码

    1062 - Duplicate entry '1' for key 1 唯一性错误

  3. TMS X-Cloud Todolist with FNC

    Wednesday, June 22, 2016 It's almost three months since we released the first version of the TMS FNC ...

  4. delphi datasnap 心跳包

    为了能让我们的服务程序更加稳定,有些细节问题必须解决.就如上一讲中提到的客户端拔掉网线,造成服务器上TCP变成死连接,如果死连接数量过多,对服务器能长期稳定运行是一个巨大的威胁.另外,经过测试,如果服 ...

  5. uber司机如何注册 uber司机详细注册流程

        注意:本文驾驶证行驶证图片为本人拍摄,请广大网友勿作它用 转载请修改! 详细的介绍注册优步uber司机端步骤; uber对司机的要求: 车辆为本地牌照 车龄在5年以内 裸车价格在10万以上 目 ...

  6. ASP.NET动态的网页增删查改

    动态页面的增删查改,不多说了,直接上代码 跟前面的一般处理程序一样我上用的同一套三层,只是UI层的东西不一样,在纠结着要不要重新在上一次以前上过的代码: 纠结来纠结去,最后我觉得还上上吧,毕竟不上为我 ...

  7. vs2010 项目编译 ResGen.exe”已退出,代码为 -1073741701

    解决的办法如下: 1.关闭所有Visual Studio: 2.以管理员的身份打开命令提示窗口:(开始-运行-cmd) 3.更改目录至"CD C:\Program Files (x86)\M ...

  8. Linq to Sqlite连接

    本人还是挺喜欢用Sqlite,鼓捣半天终于连上了,赶紧记录一下 1.当然还是新建一个项目,还是winform, 2.Vs2012添加NoGet,点击工具--扩展和更新,搜索NoGet,安装. 3.管理 ...

  9. c#学习心得,慢慢添加,如果有错误希望大家留言,我刚开始学

    1.class类:相当于整个项目的一个功能性程序,为了阐述系统中某个对象的功能. 方法:相当于程序的一个功能部件.可以被其他方法或类调用?感觉这个问题有点复杂 c#框架结构:我目前接触到的 using ...

  10. Visual Studio的ASP.NET修改默认打开浏览器

    1.新建web空应用程序,输入项目名称. 2.右击项目名称,添加“新建项”—一般处理程序 3.右击新建一个HTML文件,任意命名. 4.右击新建的Html文件,选择“浏览方式” 5.选择后弹出浏览器选 ...