ECMAScript 5中的数据属性和访问器属性
简介
ECMAScript 定义的对象中有两种特殊的属性, 这两种特殊的属性在你定义对象属性时就会赋予, 我们在必要时可以改写这两种特殊的属性让其属性的访问更加的合理化, 这两种特殊的属性称呼及作用如下:
数据属性: 通过对数据属性的设置, 我们可以让用户操作普通的数据(obj.name)时限制他们可以操作的权限, 可以让其数据变得不可修改、不可在for...in中被其枚举、不可以删除该数据并且不能让其改变原有的部分数据属性([[ Enumerable ]]、[[ Configurable ]])等。
访问器属性:
总的来说就是对对象中的属性进行一个设置、 比如当你不想让这个属性对外公开时你就可以用到以上的两种特殊属性。
数据属性
首先我们来看一下数据属性的具体特性:
| 描述特性 |
数据类型 |
描述 |
默认值 |
| [[Value]] |
任何的ECMAScript类型 |
包含这个属性的数据值 |
undefined |
| [[Writable]] |
Boolean |
如果该值为false,则该属性的[[Value]]特性,不能被改变 |
false |
| [[Enumerable]] | Boolean | 如果该值为true, 则该属性可以用for...in 循环来枚举 |
false |
| [[Configurable]] | Boolean | 如果该值为false,则该属性不能被删除,并且无法再次配置属性的特性, | false |
以下方法简介是我们在接下来的实践中会用到的:
Object.defineProperty:直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。
Object.getOwnPropertyDescriptor:返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
首先我们来查看一下数据属性是怎样的呢:

这里我们通过Object.getOwnPropertyDescriptor来获取我所定义的 fun 属性对应的数据属性, 可以看到返回的对象中的属性名字都是数据属性的具体特性名称, 那么我们来实践一下数据属性设定后的影响吧。
这里我们通过Object.defineProperty方法来进行设定:
这里可以明显看到当我们对obj中fun属性设置数据属性[[Value]]为"static"后, obj中fun原值是一个函数, 但现在已经改变为了"static"字符串。
由于在上面我们已经改写了obj.fun的数据属性[[Writable]], 所以在这里对fun属性进行改写是没有成功写入的。
当我们尝试对obj.fun属性进行删除、 在这里返回了false, 而后我们想再次修改fun属性的[[Enumerable]]的值时, 会报错
,这是我们修改[[Configurable]]后的结果。
当我们尝试枚举obj的属性列表时, 这是我们修改[[Enumerable]]的结果。 如果想要枚举一个对象的所有属性名,可以用Object.getOwnPropertyNames方法来获取, 这里不再演示。
最后, 再次通过Object.getOwnPropertyDescriptor方法来查看fun的数据属性, 这时已经变为我们设置后的
访问器属性
| 描述特性 | 数据类型 | 描述 |
默认值 |
| [[Get]] |
函数对象或者undefined |
该函数使用一个空的参数列表,能够在有权访问的情况下读取属性值。另见 get。 | undefined |
| [[Set]] | 函数对象或者undefined |
该函数有一个参数,用来写入属性值, 另见set | undefined |
还有两个其它的属性, 和数据属性是一毛一样, 唯一不同就是此时[[Configurable]]代表了能不能转变成一个数据属性。
访问器属性的定义也是通过Object.defineProperty来进行的, 其使用方式也和数据属性的定义一样, 只是value和writable变为了get和set, 我不想进行无意义的实践, 下面我将说的是刚刚我没理解的访问其属性和数据属性。
最后
写这篇文章到一半的时候,我对数据属性和访问器属性的理解已经和原含义走了相反的路线, 一直以为这两个属性是作为对象属性(obj.fun)的附属品, 就像是附魔卡一样, 这就造成了我在对对象属性设置描述时使用同一种方法定义两种不同的描述时产生的困惑, 一个是我已经数据属性和访问器属性是可以共存的属性, 就像可以附魔多张魔法卡一样, 但当看到访问器属性和数据属性的描述时, 却有两个看似相同的描述, 让我好般不懂。
后来在这个问题的回答突然懂了, 原来访问器属性和数据属性是一种定义对象属性的内部形式的方法, 这两种属性定义是让对象属性类似从AD变为AP的方法,这会改变对象属性的表现形式,而不是附加特性, 严格而论就是:对象的属性有两种互不相干的表现形式。 我想很多读者在这里也懂了, 吾愚笨, 深觉此问题有趣也, 所以写在了最后。
ECMAScript 5中的数据属性和访问器属性的更多相关文章
- Js中的数据属性和访问器属性
Js中的数据属性和访问器属性 在javaScript中,对象的属性分为两种类型:数据属性和访问器属性. 一.数据属性 1.数据属性:它包含的是一个数据值的位置,在这可以对数据值进行读写. 2.数据属性 ...
- JavaScript中的数据属性和访问器属性
在学习JavaScript原型(prototype)和原型链(prototype chain)知识的时候,发现数据属性和访问器属性的重要性,通过不断的查找相关知识,浅显理解如下,若有差错,希望不吝赐教 ...
- ECMAScript中有两种属性:数据属性和访问器属性。
ECMA-262定义这些特性是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们.为了表示特性是内部值,该规范把它们放在了两对儿方括号中,例如 [[Enumerable ...
- js中属性类型:数据属性与访问器属性
js中属性类型分为两种:数据属性和访问器属性 在js中,对象都是由名值对构成的,名:就是我们所说的属性名,值就是属性对应的值(基本值.对象.方法). ECMA-262第5版定义了只有内部才用的特性,描 ...
- javascript对象属性——数据属性和访问器属性
ECMA-262第五版在定义时,描述了属性property的各种特征,定义这些特性是为了实现javascript引擎用的,为了表示该特性是内部值,规范把它们放在了两对儿方括号中,例如[[Enumera ...
- JavaScript 数据属性和访问器属性
在JavaScript中对象被定义为"无序属性的集合,其属性可以包含基本值.对象或函数."通俗点讲,我们可以把对象理解为一组一组的名值对,其中值可以是数据或函数. 创建自定义对象通 ...
- JavaScript 属性类型(数据属性和访问器属性)
数据属性 数据属性包含一个数据值的位置.在这个位置可以读取和写入值.数据属性有 4 个描述其行为的特性. [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修 ...
- JavaScript数据属性与访问器属性
ES5中对象的属性可以分为‘数据属性’和‘访问器属性’两种. 数据属性一般用于存储数据数值,访问器属性对应的是set/get操作,不能直接存储数据值. 数据属性特性:value.writable.en ...
- 浅谈Javascript数据属性与访问器属性
ES5中对象的属性可以分为‘数据属性’和‘访问器属性’两种. 数据属性一般用于存储数据数值,访问器属性对应的是set/get操作,不能直接存储数据值. 数据属性特性:value.writable.en ...
随机推荐
- 在新机器部署Qt+mysql程序
1.一般情况下需要将Qt5Core.dll,Qt5Gui.dll,Qt5Sql.dll,Qt5Widgets.dll,platforms\qwindows.dll msvcp120.dll,msvcp ...
- nginx.conf配置文件里的upstream加入健康检查
查看NGINX启用了那些模块: # ./nginx -V Tengine version: Tengine/ (nginx/) built by gcc (Red Hat -) (GCC) TLS S ...
- 在WebApi中 集成 Swagger
1. Swagger(俗称:丝袜哥)是什么东西? Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同 ...
- Java 8相关
语言生态系统中的所有语言都有优胜劣汰的压力.虽然Java语言当前还在健康发展,但是保不定哪天就完蛋了. Java8增加的新特性从根本上来说是为了提高搬砖的姿势和效率. 多核编程的更好支持. 方法成为一 ...
- JAVA基础中的注意点(二)
1.数组 a.特点:同种数据类型:数组类型一旦确定就不能改变. 连续空间存放:数据空间是连续的. 空间长度:数组有自己的长度,初始化的时候需要定义. 数组的下标:从0开始,第一个数组元素下标为0,最后 ...
- markdown 常用语法 (在macdown内使用正常)
顺便附上 MacDown的官网,我觉得MacDown挺好用的,推荐给大家! #一级标题 ##二级标题 ###三级标题 ####四级标题 #####五级标题 ######六级标题 *** ###使用分割 ...
- 【转】XAMPP中配置多个网站
XAMPP虚拟主机配置,多域名绑定访问本地站点 XAMPP有时候你需要一些顶级域名访问方式来访问你本地的项目也就是虚拟主机配置,这时候就需要配置虚拟主机,给你的目录绑定一个域名,实现多域名绑定访问. ...
- Easyui的Dialog的toolbar的自定义添加
最近一直在写快速定制Web表格,基于Easyui,整个过程使用了大量的Easyui的dialog,每个dialog的代码大部分都雷同,感觉代码出现了很大程度的重复,然后想写一个通用的dialog设置函 ...
- 说说 js String
首先说说js的字符串,说到字符串这个就和我们原来的C# 代码有区别的就是,js里面没有chart类型.就是说他里面的 “ ”和‘ ’是要表达一样的意思. 其实这个里面就有一个问题了特别实在拼接字符串的 ...
- 初识genymotion安装遇上的VirtualBox问题
想必做过Android开发的都讨厌那慢如蜗牛的 eclipse原生Android模拟器吧! 光是启动这个模拟器都得花上两三分钟,慢慢的用起来手机来调试,但那毕竟不是长久之计,也确实不方便,后来知道了g ...