简介

ECMAScript 定义的对象中有两种特殊的属性, 这两种特殊的属性在你定义对象属性时就会赋予, 我们在必要时可以改写这两种特殊的属性让其属性的访问更加的合理化, 这两种特殊的属性称呼及作用如下:

  1. 数据属性: 通过对数据属性的设置, 我们可以让用户操作普通的数据(obj.name)时限制他们可以操作的权限, 可以让其数据变得不可修改、不可在for...in中被其枚举、不可以删除该数据并且不能让其改变原有的部分数据属性([[ Enumerable ]]、[[ Configurable ]])等。

  2. 访问器属性:

总的来说就是对对象中的属性进行一个设置、 比如当你不想让这个属性对外公开时你就可以用到以上的两种特殊属性。

数据属性

首先我们来看一下数据属性的具体特性

描述特性
数据类型
描述
默认值
[[Value]]
任何的ECMAScript类型
包含这个属性的数据值
undefined
[[Writable]]
Boolean
如果该值为false,则该属性的[[Value]]特性,不能被改变
false
[[Enumerable]] Boolean 如果该值为true, 则该属性可以用for...in 循环来枚举
false
[[Configurable]] Boolean 如果该值为false,则该属性不能被删除,并且无法再次配置属性的特性,  false

以下方法简介是我们在接下来的实践中会用到的:

  1. Object.defineProperty:直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。

  2. 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中的数据属性和访问器属性的更多相关文章

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

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

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

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

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

    ECMA-262定义这些特性是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们.为了表示特性是内部值,该规范把它们放在了两对儿方括号中,例如 [[Enumerable ...

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

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

  5. javascript对象属性——数据属性和访问器属性

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

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

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

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

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

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

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

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

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

随机推荐

  1. hive创建索引

    索引是hive0.7之后才有的功能,创建索引需要评估其合理性,因为创建索引也是要磁盘空间,维护起来也是需要代价的 创建索引 hive> create index [index_studentid ...

  2. C++静态库与动态库

    C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...

  3. JS将指定的时间戳转为UTC时间

    Js中获取时间戳可用var dayMiliseconds = parseInt(new Date().valueOf());Js的时间戳单位为毫秒(1s = 1000 ms),下面是一个将制定的格式转 ...

  4. WPF MVVM中在ViewModel中关闭或者打开Window

    这篇博客将介绍在MVVM模式ViewModel中关闭和打开View的方法. 1. ViewModel中关闭View public class MainViewModel { public Delega ...

  5. 【leetcode】Majority Element

    题目概述: Given an array of size n, find the majority element. The majority element is the element that ...

  6. (一)洞悉linux下的Netfilter&iptables:什么是Netfilter?

    转自:http://blog.chinaunix.net/uid-23069658-id-3160506.html 本人研究linux的防火墙系统也有一段时间了,由于近来涉及到的工作比较纷杂,久而久之 ...

  7. ANdroid Studio查看debug SHA1

    先打开 之后再命令行里输入cd.android 回车 在输入keytool -list -keystore debug.keystore  回车 之后会显示叫你输入密钥库口令: 这是你输入androi ...

  8. (转)Mybatis高级映射、动态SQL及获得自增主键

    原文:http://www.cnblogs.com/edwinchen/p/4105278.html?utm_source=tuicool&utm_medium=referral 一.动态SQ ...

  9. gulp自动化构建

    最近正在使用gulp去帮我自动化构建一些技术块,感觉很爽,所以把gulp操作步骤给写笔记,记录下来... 首先了解什么是gulp? 我的理解是一个工具并且自动化的,能帮你把一些前端技术的语法转换成当前 ...

  10. android studio 问题1

    在使用androidStudio中,经常导入其他的项目,有时候会出现以下错误: rror:FAILURE: Build failed with an exception. * What went wr ...