1.Object1.1对象的创建(单2种)(1)字面量方式varobj={name:'zhangsan',age:18,'123':'number'}对象可以有多个属性,属性名一般不加引号,特殊情况需要加引号,如上面的'123',即不符合命名规范。(2)构造器模式varobj=newObject()obj.name='zhangsan';obj.age=20;1.2对象访问(1)属性访问a.点访问对象名称;b.方括号访问obj['name'];注意:方括号中的必填属性需要用引号括起来(2)方法访问:方法访问主要是执行对象中的方法,需要在函数调用的方式中使用//下面执行结果不同。obj.sayName();obj.sayName();//方法(3)遍历对象中属性的使用:for...in用于遍历数组或对象的属性for(customvariablenameinarray/object){Executioncode}for(obj中的varkey){varvalue=obj[key];}1.3新增删除对象中的属性(1)只能删除对象自身的属性deleteobj.name;删除对象['名称'];deleteobj.sayName//从obj对象中删除sayName属性(2)新增属性obj.name='value';1.4对象显示类型转换(3种强制类型转换)1.4.1对象类型转Boolean类型(1)使用Booleanwrapper进行转换//除了空引用(null)会被转换为false,其他都会被转换为truevarobj={name:'zhansan',age:18}console.log(Boolean(obj));//true使用布尔包装器进行转换时,有如下规则。转换为true的数据类型转换为false的值。BooleantruefalseStringAnynon-emptystring""(空字符串)NumberAnyobjectincludinginfinity)0andNaNObjectnullUndefined无undefined1.4.2对象类型到String类型的转换规则(objecttoString)(1)首先调用对象的toString方法(2)判断方法的返回值是否为基本数据类型(3)如果返回值是基本数据类型,则转换规则根据对应数据类型的转换规则进行转换(4)如果返回值不是基本数据类型,根据返回值继续调用valueOf方法(5)判断valueOf的返回值是否为基本数据类型(6)判断是否为基本数据类型,如果是基本数据类型,执行操作(3)(7)如果还是不是基本数据类型,报错1.4.3Object类型到Number类型的转换规则(ObjecttoNumber)(1)首先调用valueOf方法对象的(2)判断该方法的返回值是否为基本数据类型(3)如果返回值为基本数据类型,则转换规则按照对应数据类型的转换规则进行转换(4)如果返回值不是基本数据类型,然后在返回值的基础上继续调用toString方法(5)判断toString的返回值是否为基本数据类型(6)判断是否为基本数据类型,如果基本数据类型是操作(3)(7)如果还是不是基本数据类型报错1.5检测属性(3种)(1)in检测一个属性是对象自身的属性还是继承的属性varobj={name:'zhangsan',age:18}console.log('name'inobj);//trueconsole.log('age'inobj);//trueconsole.log('toString'inobj);//trueinheritproperty(2)Object.prototype.hasOwnProperty()检查给定的属性是否是一个对象自身的属性,继承属性返回falsevarobj={name:'zhangsan',age:18}console.log(obj.hasOwnProperty('name'));//trueconsole.log(obj.hasOwnProperty('toString'));//false不是自己的属性(3)Object.prototype.propertyIsEnumerable()是hasOwnProperty()的增强版。除了自身属性外,它还需要可枚举属性,即我们自己创建的属性varobj={name:'zhangsan',age:18}console.log(obj.propertyIsEnumerable('name'));//trueconsole.log(obj.propertyIsEnumerable('toString'));//false不是可枚举属性1.6对象原型属性和方法(原型方法,实例可以调用的方法)对象原型的常用方法(1)constructor保存用户创建当前对象的函数,原型对象对应的构造函数(2)hasOwnProperty(propertyName)检查对象的属性名是否为对象自身的属性(3)propertyIsEnumerable(propertyName)检查给定的属性在当前是否有对象实例(4)valueOf()返回对象字符串,值,布尔表示(5)toLocaleString()返回对象的字符串表示,字符串对应执行环境的区域(6)toString()返回对象的字符串(7)isPrototypeOf(Object)检查传入对象的原型a.isPrototypeOf(b)如果a是b的原型,返回true,如果b不是对象,或者a不是b的prototype,则Amount返回false1.7深入理解对象——定义属性1.7.1数据属性特点数据属性如name属性(1)[[Configurable]]:表示是否删除该属性,通过delete重新定义attribute,默认为true,为false时,不可删除(2)[[Enumerable]]:表示属性是否可以通过for-in循环返回,默认为true,为false时,不能被循环(3)[[Writable]]:表示t的值是否他的属性可以修改。(该属性直接定义在对象中,默认为true)(4)[[Value]]:包含这个属性的值name:jacky要修改属性的默认属性,必须使用ECMAScript5的Object.defineProperty(obj,prop,descriptor)方法参数说明:1.obj:必填。目标对象2.prop:必需。要定义或修改的属性的名称3.descriptor:必填。target属性所拥有的特性返回值:传入函数的对象,即第一个参数obj;Object.defineProperty(obj,'name',{configurable:true,enumeralbe:true,writable:true,value:'terry'})console.log(obj.name);注意:当我们创建一个对象,并为该对象设置一个属性时,默认的Configurable、Enumerable、Writable属性都是true,value就是属性的值。Object.defineProperties()语法:Object.definePropertise(obj,props)参数说明:1.obj:必填。目标对象2.props:该对象的一个??或多个键值对定义了对象字段要添加或修改的属性的具体配置。返回值:传入函数的对象,即第一个参数obj;varobj=new对象();Object.defineProperties(obj,name:{value:'zhangsan',configurable:false,writable:true,enumerable:true},age:{value:18,configurable:true}})console.log(obj.name,obj.age);1.7.2读取属性的属性(1)Object.getOwnPropertyDescriptor作用:该方法返回指定对象的一个??自身属性对应的属性描述符(ownproperty是指直接赋值给对象的属性,不不需要从原型链中查找)语法:Object.getOwnPropertyDescriptor(obj,prop);obj:需要查找的属性目标对象prop:目标对象中的属性名varperson={name:'张三',age:18}vardesc=Object.getOwnPropertyDescriptor(person,'name');console.log(desc);//输出结果如下//configurable:true,//enumerable:true,//writable:true,//value:'张三'(2)Object.getOwnPropertyDescriptors(obj)功能:指向对象的所有属性的描述符,如果没有任何自属性将返回一个空对象就是通过这个两种处理操作的方法的accessor属性包含四个特性:(1)[[Configurable]]:表示是否可以通过delete删除属性来重新定义属性,是否可以修改属性的属性,orwhetherthepropertycanbeChangetoanaccessorattribute,defaultisfalse(2)[[Enumerable]]:表示该属性是否可以通过for-in循环返回,默认为false(3)[[Get]]:读取属性时调用的函数,默认值为undefined(4)[[Set]]:写入属性时调用的函数,默认值为undefinedaccessor属性不能直接定义,必须通过Object.defineProperty()方法varbook={_year:2020,//下划线表示内部属性,只能通过对象编辑器的方法写入:1};Object.defineProperty(book,'year',{get:function(){returnthis._year;},//如果只指定get方法,不指定set方法,则该属性默认为只读set:function(newYear){if(newYear!==this._year)this._year=newYear;this.editor++;}})//测试访问属性中的get和set方法console.log('unmodifiedyear:'+book.year);//2020book.year=2021;console.log('修改后的年份:'+book.year);//2021console.log('修改后的年份:'+book.editor);//2//可以通过Object.getOwnPropertyDescriptor()console.log(Object.getOwnPropertyDescriptor(book,'_year'));console.log();从上面我们可以想到数据的双向绑定:a.在一个对象(book)中设置一个私有属性(_year:开头的下划线代表一个私有属性),然后设置这个对象设置accessor属性year(对象本身没有定义)b.当修改book.year时,触发set函数,通过该函数进行数据操作,如数据判断、赋值等一系列操作,从而实现数据双向绑定。1.8对象序列化(1)对象序列化是指将对象的状态转换成字符串,也可以反序列化将字符串还原为对象函数(2)RegExp、Error对象、未定义值不能序列化和deserialized(3)JSON.stringify(obj)将对象序列化为JSON字符串,只序列化对象的可枚举自身属性。(4)JSON.parse(jsonStr)反序列化
