理解对象

ES5中的对象是指无序的属性的集合。(属性可以是基本值、对象和函数)。

对象的属性类型有两种,一种是数据属性,是数据值的保存位置;另一种是访问器属性,包含getter和setter函数。

1.1 数据属性

数据属性包含一个数据值的位置,在这个位置可以读取和写入值。数据属性有四个描述其特征的特性。(这些特性是为javascript内部引擎服务的,不能直接访问,所以将它们放在方括号中。)

  1. [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。默认值为true。
  2. [[Enumerable]]: 能否通过for-in循环返回属性。默认值为true。
  3. [[Writable]]:能否修改属性的值,默认值为true。
  4. [[Value]]: 属性的数据值,默认为undefined。

!!!此处说的默认值是指直接定义时的默认值,与使用defineProperty()定义的属性默认值不同

数据属性可以直接使用对象字面量或new Object对象来定义,而这些特性值不能直接访问,要修改默认的特性,要使用定义在Object对象中的defineProperty()函数

!!!在调用 Object.defineProperty()方法时,如果不指定configurable、enumerable 和writable 特性的默认值都是 false。

示例如下:

// 使用对象字面量创建一个对象
var person = {};//修改该对象属性的默认特性
/*第一个参数为属性所在的对象。第二个参数为要定义的属性名。第三个参数是其特性描述符的对象。(属性为configurable, enumerable, writable, value)
*/
Object.defineProperty(person, "name", { writable: false, value: "Nicholas"
});//这样就可以访问定义好的数据属性了
alert(person.name); //"Nicholas" //在定义属性时将writable设定为false,所有对name属性的值更改操作无效。(严格模式下会报错)
person.name = "Greg";
alert(person.name); //"Nicholas"

另外将把 configurable 设置为 false,表示不能从对象中删除属性。如果对这个属性调用 delete,则在非严格模式下什么也不会发生,而在严格模式下会导致错误。一旦把属性定义为不可配置的,就不能再把它变回可配置了。 此时,Object.defineProperty()方法修改除 writable 之外的特性,都会导致错误。

1.2 访问器属性

访问器属性不包含数据值,包含一对 getter 和 setter 函数(不必需)。
在读取访问器属性时,会调用 getter 函数,这个函数负责返回有效的值;
在写入访问器属性时,会调用setter 函数并传入新值,这个函数负责决定如何处理数据。
访问器属性也包含了四个特性。

  1. [[Configurable]]: 表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。默认值为true。
  2. [[Enumerable]]: 能否通过for-in来访问属性。默认值为true。
  3. [[Get]]: 读取属性时调用的函数。默认值为undefined。
  4. [[Set]]:写入属性时调用的函数,默认值为undefined。

访问器属性不能直接定义,必须要使用Obiect.defineProperty()来定义。定义的过程于数据属性类似。

var book = { _year: 2004,  //'_'是一种常用于表示只能通过对象方法访问的属性的记号edition: 1
};
/*第一个参数为属性所在的对象。第二个参数为要定义的访问器属性名。第三个参数是其特性描述符的对象。(属性为configurable, enumerable, get, set)
*/
Object.defineProperty(book, "year", {
// 访问一个私有变量get: function(){ return this._year; }, // set常用于改变一个变量导致其他变量改变的情形set: function(newValue){ if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } }
});
book.year = 2005;
alert(book.edition); //2

不一定非要同时指定 getter 和 setter。
只指定 getter 意味着属性是不能写,在非严格模式下尝试写入属性会被忽略。
类似地,只指定 setter 函数的属性也不能读,在非严格模式下会返回 undefined。
在严格模式下,尝试写入只指定了 getter 函数的属性和读取只指定了 setter函数的属性会抛出错误。

定义多个属性

上面介绍的Object.defineProperty()方法只能定义单个属性,Object.defineProperties()方法可以通过描述符一次定义多个属性。
!!!在调用 Object.defineProperties()方法时,如果不指定configurable、enumerable 和writable 特性的默认值都是 false。
示例如下:

var book = {};
Object.defineProperties(book, { //定义数据属性_year: { value: 2004 }, edition: { value: 1 }, // 定义访问器属性year: { get: function(){return this._year; }, set: function(newValue){ if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } }
});

读取属性的特性

JS中的Object。getOwnPropertyDescriptor()方法可以取得给定的对象属性描述符。对上一节中定义的book对象,有以下示例:

// 该方法接受两个参数  第一个参数是对象   第二个参数是对应的属性
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
alert(descriptor.value); //2004
alert(descriptor.configurable); //false
alert(typeof descriptor.get); //"undefined" var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value); //undefined
alert(descriptor.enumerable); //false
alert(typeof descriptor.get); //"function"

在 JavaScript 中,可以针对任何对象——包括 DOM 和 BOM 对象,使用 Object.getOwnPropertyDescriptor()方法。

JS对象中的属性类型、属性定义和属性读取相关推荐

  1. js 对象中添加新属性

    js 对象中添加新属性 对象数组添加新属性 同名属性会被覆盖,相同属性会去重

  2. JS对象中常见的方法

    本文主要介绍Native对象,即在ECMAScript标准中定义和描述,包括JavaScript内置对象(数组,日期对象等)和用户自定义的对象 目录 1. 对象的创建并添加属性 1. new 对象 2 ...

  3. js 对象中,可枚举性(enumerable)是什么?

    js 对象中,可枚举性(enumerable)是什么? 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在 for-in 循环之中(除非属性名是一个 Symbol).具体来说,如果一 ...

  4. 这样写,才可以让JS对象中的key包含短横杠-

    这样写,才可以让JS对象中的key包含短横杠- 在定义对象时,如果直接将包含短横杠-的字符串作为对象的key,JS会报错: const o = {v-red: 1 // 报错 SyntaxError: ...

  5. java枚举类型定义_java中的枚举类型怎么定义?

    展开全部 Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自62616964757a686964616fe59b9ee7ad9431333236366331己的变量, ...

  6. 按照js对象中的某个值进行排序

    sort顺序排序 var arr=[9,8,6,5,3,1,2,7,4] arr.sort() //返回值 [1, 2, 3, 4, 5, 6, 7, 8, 9] 降序排列 var arr=[9,8, ...

  7. JS对象中添加新的属性及修改字段名

    添加 arr[0]["sex"]="男" 修改(name1,age1为name,age) var arr = [{name1:'a',age1:'1'},{na ...

  8. js对象、构造函数、命名空间、方法、属性

     <script language="javascript">   var myNameSpace = new Object(); //构造一个命名 空间myCla ...

  9. 查看so库中是否有某个定义_论Linux ELF中动态库符号重定义利用 属性/Linker 做隐藏的手法...

    假如libgetthree.so libgetseven.so , 同时这两个so内部都用了internal_do_calculation()函数,并且各自定义了自己的internal_do_calc ...

最新文章

  1. [20170728]oracle保留字.txt
  2. 在VS2010/MFC中如何对对话框添加控件
  3. Spring学习笔记:Spring整合Mybatis(mybatis-spring.jar)(二:mybatis整合spring)
  4. Object o与Object o=null的区别
  5. Android JNI入门第一篇——HelloJni
  6. JDK1.1 JDK1.2 JDK1.3 JDK1.4 JDK1.5 JDK1.6 JDK1.7
  7. 【Boost】boost库中智能指针——intrusive_ptr
  8. 推荐21个顶级的Vue UI库!
  9. Cannot change version of project facet Dynamic Web Module to 2.5解决方案
  10. 忆我在北邮四年中的几位老师(全)
  11. Android 函数响应式编程(RxJava3)
  12. “文件大小”和“占用空间”的区别
  13. 京东云php环境配置,玩转京东云主机之④-利用宝塔软件搭建服务器PHP环境
  14. 【系统设计】本地生活之附近商家 LBS 服务实现
  15. ICPR MTWI 2018挑战赛 网络图像的文本识别之数据预处理
  16. 项目绩效分析方法-挣值技术
  17. Standardized QCI characteristics
  18. 创意者更新发布在即:欧美Win10份额已超Win7
  19. ROS系列——关于OpenCV读取和设置网络摄像头参数的问题
  20. OpenLayers之 图层

热门文章

  1. SaaS普及引发SaaS用户对数据集成的需求
  2. 开博尔智能android播放器C3,开博尔C3四核最新固件Android4.4_KIUI7.0_v1.0.4
  3. ASP.NET 验证控件安全隐患
  4. TCGA数据下载教程:使用官方gdc-client软件下载
  5. C语言实现选择排序——简单选择排序算法
  6. 2016阿里安全峰会重点资料下载
  7. 华三防火墙web端口_H3C SecPath F100-C-AI防火墙 Web配置指导-5PW100
  8. ftp登录shell为nologin无法登录
  9. 如何使用HTML,CSS和JavaScript创建 二进制计算器?
  10. 机器学习——基于M-distance的推荐