javascript对象属性——数据属性和访问器属性
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对象属性——数据属性和访问器属性的更多相关文章
- JavaScript中的数据属性和访问器属性
在学习JavaScript原型(prototype)和原型链(prototype chain)知识的时候,发现数据属性和访问器属性的重要性,通过不断的查找相关知识,浅显理解如下,若有差错,希望不吝赐教 ...
- js对象的数据属性和访问器属性
js面向对象 ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征.ECMA-262定义这些特性是为了实现javascript引擎用的,因此 ...
- JS的数据属性和访问器属性
ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征.ECMA-262定义这些特性是为了实现javascript引擎用的,因此在javasc ...
- JavaScript 数据属性和访问器属性
在JavaScript中对象被定义为"无序属性的集合,其属性可以包含基本值.对象或函数."通俗点讲,我们可以把对象理解为一组一组的名值对,其中值可以是数据或函数. 创建自定义对象通 ...
- JavaScript 属性类型(数据属性和访问器属性)
数据属性 数据属性包含一个数据值的位置.在这个位置可以读取和写入值.数据属性有 4 个描述其行为的特性. [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修 ...
- JavaScript数据属性与访问器属性
ES5中对象的属性可以分为‘数据属性’和‘访问器属性’两种. 数据属性一般用于存储数据数值,访问器属性对应的是set/get操作,不能直接存储数据值. 数据属性特性:value.writable.en ...
- 浅谈Javascript数据属性与访问器属性
ES5中对象的属性可以分为‘数据属性’和‘访问器属性’两种. 数据属性一般用于存储数据数值,访问器属性对应的是set/get操作,不能直接存储数据值. 数据属性特性:value.writable.en ...
- Js中的数据属性和访问器属性
Js中的数据属性和访问器属性 在javaScript中,对象的属性分为两种类型:数据属性和访问器属性. 一.数据属性 1.数据属性:它包含的是一个数据值的位置,在这可以对数据值进行读写. 2.数据属性 ...
- js中属性类型:数据属性与访问器属性
js中属性类型分为两种:数据属性和访问器属性 在js中,对象都是由名值对构成的,名:就是我们所说的属性名,值就是属性对应的值(基本值.对象.方法). ECMA-262第5版定义了只有内部才用的特性,描 ...
随机推荐
- win7本地搭建git ssh服务器
本来是想在gogs上用ssh的,结果弄了好几次还没整明白,希望等他们的更新内置吧. 但是,意外收获,还是成功搭建了本地ssh服务器,只是没有和gogs成功关联. 简要记录一下: 主要软件: msysg ...
- libmemcached安装及简单例子
libmemcached安装及简单例子 1.下载安装libmemcached $ wget http://launchpad.net/libmemcached/1.0/0.44/+download/ ...
- Android 流媒体系列(二)
import java.io.IOException; import android.app.Activity; import android.content.ContentResolver; imp ...
- 补丁(patch)的制作与应用
命令简介 用到的两个命令是diff和patch. diff diff可以比较两个东西,并可同时记录下二者的区别.制作补丁时的一般用法和常见选项为: diff [选项] 源文件(夹) 目的文件(夹) - ...
- SpringMVC深入理解
核心类与接口 - DispatcherServlet 前置控制器- HandlerMapping 请求映射(到Controller)- HandlerAdapter 请求映射(到Controller类 ...
- div中央
.histroyMsgSearch{ background:#Fff; text-align: center; } CSS 怎样使DIV层水平居中 今天用CSS碰到个非常棘手的问题,DIV本身未定义 ...
- c/c++测试程序运行时间
算法分析中需要对各种算法进行性能测试,下面介绍两种通用的测试方法,由于只用到标准c语言函数,所以在各种平台和编译器下都能使用. 方法1: clock()函数 开始计时:start = clock() ...
- SQL数据库的应用一(Day 24)
哈哈,又到了新的一周.我们也开始学习新的知识了,从今天开始学习SQL数据库的一些知识.今天主要讲了一些数据库.表的创建管理,和一些约束的定义使用.(这里使用的是SQL语句)下面我就具体总结一下. 总结 ...
- 将Oracle数据库导出为txt格式
将Oracle数据库导出为txt格式: 方法1: 对于Windows系统,可以采用以下方式: 选择控制面板-->管理工具-->数据源(ODBC),添加一个新的数据源(系统或用户DSN均可) ...
- ##DAY7 UINavigationController
##DAY7 UINavigationController #pragma mark ———————UINavigationController——————————— 概括: 导航视图控制器也是一个视 ...