Skip to content

Latest commit

 

History

History
137 lines (69 loc) · 7.41 KB

对象格式深入讲解.md

File metadata and controls

137 lines (69 loc) · 7.41 KB

1、什么是对象?

​ 对象是属性的无序集合,每个属性都是一个名/值对、属性名称是一个字符串

​ 属性名称 :属性值

2、对象的种类

​ 2.1、内置对象(native object):是由ECMAScriipt规范定义的对象或类。例如数组,函数,日期和正则表达式都是内置对象。

​ 2.2、宿主对象(host boject):是由JavaScript解释器所嵌入的宿主环境(比如Web浏览器)定义的。常见的宿主对象有window,document等。

​ 2.3、自定义对象(user-defined boject):是由运行中的JavaScript代码创建的对象。

3、创建对象的方法

​ 3.1、对象直接量:对象直接量是由若干名/值对组成的,名/值对中间用冒号分割,名/值对之间用逗号分割。整个对象用花括号括起来。

​ 属性名可以是JavaScript标识符(即变量符号,如a,b)也可以是字符串(包括空字符串,如“a”,“b”,“c”)。

​ 属性值可以是任意类型的JavaScript表达式,表达式的值(可以是基本数据类型的值也可以是对象类型的值)。

​ 3.2、通过new指令创建对象

​ 关键字new后面跟随一个函数调用。这里的函数称作构造函数(constructor),构造函数用以初始化一个新创建的对象。

​ var o=new Object(); //创建一个空对象,和{ }一样

​ var a=new Array(); //创建一个空数组,更[ ]一样

​ var d=new Date(); //创建一个表示当前时间的Date对象

​ var r=new RegExp("js"); //创建一个可以进行模式匹配的EegExp对象4

4、对象的属性的常用操作

​ 4.1、删除对象属性:

​ delete运算符可以删除对象属性。它的操作数应当是一个属性访问表达式。

需要注意的是:delete只是断开属性和宿主对象的联系,而不会操作内存中对象的属性的值的存在与否

​ 4.2、检测对象属性之in运算符

​ 我们经常会检测集合中成员的所属关系——判断某个属性是否存在于某个对象中,可以通过in运算符、hasOwnPrepety()方法来完成这个工作,甚至仅通过属性查询也可以做到这一点。

​ in运算符的左侧是属性名(字符串或是一个能够返回字符串的表达式),右侧是对象。如果对象的自有属性或继承属性中包含这个属性则返回true,不包含则返回false。

​ 4.3、检测对象属性之hasOwnPrepety()

​ 对象的hasOwnPrepety()方法用来检测给定的名字是否是对象的自有属性。对于不存在的属性和继承属性它将返回false;

​ var 0 ={

​ x :1

​ }

​ o.hasOwnPreperty("x"); //true。o有一个自有属性x

​ o.hasOwnPreperty("y"); //false。o中不存在属性y

​ o.hasOwnPreperty("toString"); //false;toSring是继承属性;

​ 4.4、枚举对象之propertyEnumerable()

​ 除了检测对象的属性是否存在,我们还会经常遍历对象的属性, 通常使用for/in循环遍历 for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承的属性) 对象继承的内置方法不可枚举的,但在代码中给对象添加的属性都是可枚举的

​ var 0={

​ x:1,

​ y:2,

​ z:3

​ }

​ o.propertyIsEnumerable("toString") //输出false,不可枚举;

​ for(p in o){

​ console.log(p);

​ }

5、对象的属性特性

​ 属性特性所服务的对象是JavaScript的解析引擎,是JavaScript引擎的内部值,所以作为程序员是无法直接获取到的,**在JavaScript中对象的属性有两种,分别是数据属性和访问属性。**为了表示特性是内部值该规范把他们放在了两对方括号中,例如[[Enumber]]

​ 数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特征。

​ 5.1、[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。

​ 5.2、[[Enumber]]:表示能否通过for-in循环返回属性。

​ 5.3、[[Writable]]:表示能否修改属性值,

​ 5.4、[[Value]]:包含这个属性的数据值。读取属性值的时候,从这个位置读:写入属性值的时候,把属性保存在这个位置。这个特性的默认值为underfined。

​ 1)、获取对象属性的特性Object.getOwnPropertyDescriptor()

​ 为了实现属性特性的查询和设置操作,ECMAScript 5中定 义了一个名为“属性描述符”(property descriptor)的 对象, 每一个属性都有一个属性描述符, 获取方式如上. 从函数名字就可以看 出,Object.getOwnPropertyDescriptor()只能得到自有 属性的描述符。要想获得继承属性的特性,需要遍历原型 链

​ 2)、设置对象属性的特性Object.defineProperty()

​ 要想设置属性的特性,或者想让新建属性具有某种特性,则需要调用Object.defineProperty(),传入要修 改的对象、要创建或修改的属性的名称以及属性描述符对象:

​ Object.defineProperty( {待修改对象 } , “属性名称”, {描述符对象 } )

​ 3)、设置对象属性的特性Object.defineProperty()

​ 要想设置属性的特性,或者想让新建属性具有某种特性,则需要调用Object.defineProperty(),传入要修 改的对象、要创建或修改的属性的名称以及属性描述符对象:

​ Object.defineProperty( {待修改对象 } , “属性名称”, {描述符对象 } )

六、对象的方法

​ 对象的属性值的类型可以任意, 如果某个对象的属性的值的类型是函数的话, 那么我们把这 个值为函数的属性名称称之为对象的方法 典型代表有.toString();

​ 6.1、对象的方法之this

​ 函数中的this 对象是在运行时基于函数的执行环境绑定的:在全局函数中,this 等于window,而 当函数被作为某个对象的方法调用时,this 等于那个对象。不过,匿名函数的执行环境具有全局 性,因此其this 对象通常指向window。

其他代码中的this指的是, 该行代码的运行环境

​ 6.2、对象访问器属性之getter和setter

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

​ 访问器属性有如下4 个特性。

​ [[Configurable]]:表示能否通过delete 删除属性从而重新定义属性,能否修改属性的特 性,或者能否把属性修改为数据属性。对于直接在对象上定义的属性,这个特性的默认值为true。

​ [[Enumerable]]:表示能否通过for-in 循环返回属性。对于直接在对象上定义的属性,这 个特性的默认值为true。

​ [[Get]]:在读取属性时调用的函数。默认值为undefined。 [[Set]]:在写入属性时调用的函数。默认值为undefined。 访问器属性不能直接定义,必须使用Object.defineProperty()来定义