深入理解对象类型
2018-01-19 00:00
295 查看
对象最常见的用法是创建、设置、查找、删除、检测和枚举它的属性。
属性包括名字和值。属性名可以是包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。值可以是任意JavaScript值,或者(在ECMAScript 5中)可以是一个getter或setter函数,除了名字和值之外,每个属性还有一些与之相关的值,称为“属性特性”
对象和属性
内置对象是由ECMAScript规范定义的对象或类。例如,数组、函数、日期和正则表达式都是内置对象。
宿主对象是由JavaScript解释器所嵌入的宿主环境(比如Web浏览器)定义的。客户端JavaScript中表示网页结构的HTMLElement对象均是宿主对象。既然宿主环境定义的方法可以当成普通的JavaScript函数对象,那么宿主对象也可以当成内置对象。
自定义对象是由运行中的JavaScript代码创建的对象。自有属性是直接在对象中定义的属性。
继承属性是在对象的原型对象中定义的属性。
创建对象对象直接量通过new创建对象原型Object.create()
elete运算符可以删除对象的属性。delete运算符只能删除自有属性,不能删除继承属性(要删除继承属性必须从定义这个属性的原型对象上删除它,而且这会影响到所有继承自这个原型的对象)。
JavaScript对象可以看做属性的集合,我们经常会检测集合中成员的所属关系——判断某个属性是否存在于某个对象中。可以通过in运算符、hasOwnPreperty()和propertyIsEnumerable()方法来完成这个工作,甚至仅通过属性查询也可以做到这一点。
in运算符的左侧是属性名(字符串),右侧是对象。如果对象的自有属性或继承属性中包含这个属性则返回true
对象的hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性。对于继承属性它将返回false
propertyIsEnumerable()是hasOwnProperty()的增强版,只有检测到是自有属性且这个属性的可枚举性为true时它才返回true。
ECMAScript 5定义了两个用以枚举属性名称的函数。第一个是Object.keys(),它返回一个数组,这个数组由对象中可枚举的自有属性的名称组成。
ECMAScript 5中第二个枚举属性的函数是Object.getOwnPropertyNames(),它和Ojbect.keys()类似,只是它返回对象的所有自有属性的名称,而不仅仅是可枚举的属性。
我们知道,对象属性是由名字、值和一组特性构成的。在ECMAScript5中,属性值可以用一个或两个方法替代,这两个方法就是getter和setter。由getter和setter定义的属性称做“存取器属性”,它不同于“数据属性”,数据属性只有一个简单的值。当程序查询存取器属性的值时,JavaScript调用getter方法(无参数)。这个方法的返回值就是属性存取表达式的值。当程序设置一个存取器属性的值时,JavaScript调用setter方法,将赋值表达式右侧的值当做参数传入setter。
通过调用Object.getOwnPropertyDescriptor()可以获得某个对象特定属性的属性描述符。
要想设置属性的特性,或者想让新建属性具有某种特性,则需要调用Object.definePeoperty(),传入要修改的对象、要创建或修改的属性的名称以及属性描述符对象
属性包括名字和值。属性名可以是包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。值可以是任意JavaScript值,或者(在ECMAScript 5中)可以是一个getter或setter函数,除了名字和值之外,每个属性还有一些与之相关的值,称为“属性特性”
对象和属性
内置对象是由ECMAScript规范定义的对象或类。例如,数组、函数、日期和正则表达式都是内置对象。
宿主对象是由JavaScript解释器所嵌入的宿主环境(比如Web浏览器)定义的。客户端JavaScript中表示网页结构的HTMLElement对象均是宿主对象。既然宿主环境定义的方法可以当成普通的JavaScript函数对象,那么宿主对象也可以当成内置对象。
自定义对象是由运行中的JavaScript代码创建的对象。自有属性是直接在对象中定义的属性。
继承属性是在对象的原型对象中定义的属性。
创建对象对象直接量通过new创建对象原型Object.create()
elete运算符可以删除对象的属性。delete运算符只能删除自有属性,不能删除继承属性(要删除继承属性必须从定义这个属性的原型对象上删除它,而且这会影响到所有继承自这个原型的对象)。
JavaScript对象可以看做属性的集合,我们经常会检测集合中成员的所属关系——判断某个属性是否存在于某个对象中。可以通过in运算符、hasOwnPreperty()和propertyIsEnumerable()方法来完成这个工作,甚至仅通过属性查询也可以做到这一点。
in运算符的左侧是属性名(字符串),右侧是对象。如果对象的自有属性或继承属性中包含这个属性则返回true
对象的hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性。对于继承属性它将返回false
propertyIsEnumerable()是hasOwnProperty()的增强版,只有检测到是自有属性且这个属性的可枚举性为true时它才返回true。
ECMAScript 5定义了两个用以枚举属性名称的函数。第一个是Object.keys(),它返回一个数组,这个数组由对象中可枚举的自有属性的名称组成。
ECMAScript 5中第二个枚举属性的函数是Object.getOwnPropertyNames(),它和Ojbect.keys()类似,只是它返回对象的所有自有属性的名称,而不仅仅是可枚举的属性。
我们知道,对象属性是由名字、值和一组特性构成的。在ECMAScript5中,属性值可以用一个或两个方法替代,这两个方法就是getter和setter。由getter和setter定义的属性称做“存取器属性”,它不同于“数据属性”,数据属性只有一个简单的值。当程序查询存取器属性的值时,JavaScript调用getter方法(无参数)。这个方法的返回值就是属性存取表达式的值。当程序设置一个存取器属性的值时,JavaScript调用setter方法,将赋值表达式右侧的值当做参数传入setter。
通过调用Object.getOwnPropertyDescriptor()可以获得某个对象特定属性的属性描述符。
要想设置属性的特性,或者想让新建属性具有某种特性,则需要调用Object.definePeoperty(),传入要修改的对象、要创建或修改的属性的名称以及属性描述符对象
相关文章推荐
- 深入理解Java类型信息(Class对象)与反射机制
- 深入理解Java类型信息(Class对象)与反射机制
- 深入理解C++对象模型之类型转换:ReinterpretCast
- 深入理解Java类型信息(Class对象)与反射机制
- 深入理解Java虚拟机笔记---引用类型和对象是否死亡
- 深入理解Java类型信息(Class对象)与反射机制
- 深入理解Java类型信息(Class对象)与反射机制
- javascript 对象的深入理解
- 深入理解C系列:不同类型变量的变量名和内存间的关系
- 深入理解jvm虚拟机-判断对象是否存活
- 深入理解Java引用类型
- 第186天:js深入理解构造函数和原型对象
- c和c++的复杂类型声明深入理解
- Java垃圾回收(一)对象存活状态判断---深入理解Java虚拟机
- 深入理解JavaScript系列 ----(9):根本没有“JSON对象”这回事!
- Javascript 中的引用类型(2)—— 理解对象
- 深入理解DOM节点类型第六篇——特性节点Attribute
- 深入理解Java对象序列化
- 深入理解:XML与对象的序列化与反序列化
- 深入理解javascript原型和闭包(1)——一切都是对象