ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 前言 也许你已经认为对对象的基本认识了,但还是跟小编一起过一遍js对象的基本知识吧。 ## 对象 ### 基本分类 * 内置对象:语法内定义的对象或者类,例如数组、函数、日期和正则表达式等 * 宿主对象:js解释器所嵌入的宿主环境 * 自定义对象:解释器运行中创建的对象 ## 对象的创建 * 对象直接量 :赋值方式 var empty={}; var o={a:32,b:45} * new 关键字创建 :var obj= new Person(); * 通过`Object.creat()`; ### 对象深拷贝 * 与浅拷贝的区别是,对象的属性是非基础类型数据也是可以的 ~~~ if (typeof Object.assign != 'function') { Object.assign = function(target) { 'use strict'; if (target == null) { throw new TypeError('Cannot convert undefined or null to object'); } target = Object(target); for (var index = 1; index < arguments.length; index++) { var source = arguments[index]; if (source != null) { for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } } return target; }; } ~~~ [深拷贝参考文档](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign ) ### 对象属性 #### 属性分类 * 属性:自有属性和继承属性 * 自有属性:直接在对象中定义的属性 * 继承属性:对象的原型对象中定义的属性。 #### 属性操作 * 查询属性 1 可以通过. 或者[] 修改,中括号的时候名称需要加引号 2 赋值直接通过= 赋值即可。 * 删除属性 delete this.prop * 检测属性 1.检测所有的属性 prop in obj (包括私有属性以及继承属性) 2.检测私有属性 hasOwnProperty("x") * 遍历属性 ~~~ //for in 短循环遍历属性 for(var p in obj){ console.log(p+":"+obj[p]) } ~~~ ## 对象方法 ## 对象复制,继承等 ## es6拓展 * 对象的结构赋值 对象的赋值与数组的赋值区别最大就是,数组是按照次序赋值的,而对象是按照键值对赋值的,无序的。也就是说,变量名必须与属性同名才可以。 ~~~ var x;//已经申明过的变量,避免解释x为代码块,不在首行 ({x})={x:1};====({x}={x:1});//正确写法 //其他举例 var {foo,far}={foo:"aaa",far:"aaa"};//可以分别得到foo ,far的赋值 var {va}={foo:"aaa",far:"aaa"};//va undefined var {foo:va}={foo:"aaa",far:"aaa"};//va =aaa 变量名与属性名不一样的时候 var p={ o:[ "hello",{y:"world"}] } var {o:[x,{y}]}=p; //对象也可以用来解析嵌套 结构 ~~~ * is() 判断两个值是否相等,与===区别就是+0!=-0,nan=nan. * assign 将对象的可枚举属性复制到目标对象,至少需要两个对象作为参数。第一个是目标对象,第二个是参数对象,当为多个对象时,也会分别复制过来。特别注意的是:当属性名相同的时候,属性值会被覆盖。 ~~~ var target={a:3}; var source1={a:1}; var source2={b:3}; Object.assign(target,source1,source2); ~~~ * _proto_属性,用来读取或者设置对象的prototype对象。相关的有setPrototypeOf,getPrototypeOf() * 增强的对象写法 增强之后允许直接写入变量和函数,书写更加简洁 var person={ birth,//birth:birth hello(){}//hello=fn(); } * 属性名表达式 允许对象的属性是变量or表达式,但要求其在中括号内 ~~~ var lastword="last world"; var a={ firstword:"first world", [lastword] : 'last dew d', [lastword+'dv'] : 'last dew d' } ~~~ * Symbol 新增的原始数据类型,不可以通过new创建。可以随机生成不重复变量,获取为.name,也可以通过指定name实现。 目前得不到name ~~~ let q1=Symbol(); let q2=Symbol(); let q3=Symbol(); ~~~ * proxy 对象创建使用之前的拦截 ~~~ var person ={ name:12 } var proxy=new Proxy(person,{ get:function(target,property){ if(property in tearget){ return target[property]; }else{ throw new ReferenceError("not exist"); } } }) person.age// 抛出错误 pserson.name//12 ~~~ * 对象的监听 observe unobserve ,暂不支持 ~~~ function observer(change){ console.log(change.name+change.oldValue+change.object(change.name)+change.type); } var o={}; Object.observe(o,observer);// ~~~