对象指的是无序的数据集合,是键值对的集合。对象的键名是字符串,而不会标识符。
对象有两种声明方式,一种是使用new 后面加上object构造函数进行川内创建,另外一种是直接使用对象字面量进行创建。
属性名可以是字符串、非空字符串、其他可以转换为字符串的都可以作为属性名,而标识符则必须以字母、下划线、$字符和中文开头
以下的属性名都是正确的:
let obj1={ _we:'hello', 123:'hi', '':‘gray’, yl:'black' } 属性名可以不加引号,但是如果属性名包括中文、空格等特殊字符,则必须添加引号;以下的属性名则会报错:
let obj2={ 我:'nigh', he is:'hello' //正确应该是'he is':'hello' }如果不经过特殊的处理,对象无法识别作为键名的是常量字符串还是变量,因此需要使用一定的方法,才能让变量作为字符串
let v='name' let obj4={ v:'macycle', [v]:'huang' } 返回的结果是obj3={'v':'macycle','name':'huang'}完整的删除一个对象的属性有以下两种方法: 方法一:delete obj.xxx
let obj1={name:'小红',age:13} delete obj1.name 返回obj1的结果是{'age':13}方法二:delete[‘xxx’]
let obj2={name:'小红',age:13} delete obj2['name'] 返回obj2的结果是{'age':13}!!!以下方法并不能删除属性
let obj3={name:'小红',age:13} obj3.name=undefined; 返回obj3的结果为{'name':undefined,'age':13} obj3的name属性还存在,只是值为undefined;对于obj1的删除方式,使用 ‘name’ in obj1,返回的结果是 false; 而对于obj3的删除方式,使用‘name’ in obj3,返回的结果 是true,只不过他的值为undefined;
JS提供了查看自身属性的方法: 方法一:Object.keys(obj)
该方法用来查看对象的所有自身属性; let obj4={name:'小红',age:13} Object.keys(obj4) 返回的结果是['name','age']方法二:console.dir(obj4)
该方法用来查看对象的所有属性,包括公有属性; let obj5={name:'小红',age:13} console.dir(obj5) 返回的结果是一个对象,其中除了包括name属性与age属性,还包括创建obj5实例的构造函数的公共属性。方法三:obj.hasOwnProperty()
该方法用来查看某个属性是否属于自身的属性 let obj6={name:'小红',age:13} obj6.hasOwnProperty('toString') 返回的结果是false;方法四:‘xxx’ in obj
该方法可以查看某个属性是否属于该对象,或者是该属性是否在他的原型链上存在。 let obj7 ={name:'小红',age:13} 'name' in obj7 返回true; 'toString' in obj7 返回true;方法一:obj[‘key’]
let obj8={name:'小红',age:13} obj8['name'] 返回结果是'小红',这里需要注意的是,传入参数是一个字符串的形式,因为obj的属性虽然在书写的时候有时可以不用加引号,实际上js后面帮我们加了引号了。方法二:obj.key
let obj9={name:'小红',age:13} obj9.name 返回的结果也是'小红';在JS中,增加属性与修改属性的方法比较类似,如果该对象有某一个属性了,则属于修改属性,否则就是增加属性。
let obj10={name:'小红',age:13} obj10.name='小黄' 则obj10变成了{name:'小黄',age:13} obj10.sex='female' 则obj10变为{name:'小红',age:13,sex:'female'}ES6中,添加了assign()方法用于一次添加多个属性;
let ars={name:'cdcd',age:19} Object.assign(ars,{sex:'female',national:'japan',married:'no'}) 返回的结果是:{name: "cdcd", age: 19, sex: "female", national: "japan", married: "no"}一般情况下是无法通过自身直接修改公有属性的,那样只会给自身添加一个属性,因为公有属性是实例对象中通过一个隐藏属性__proto__中保存的指针所指向的。
let obj11={} obj11.toString='xxx'相当于向自身添加一个tostring的属性 如果想要修改公有属性,必须操作原型链上的属性 obj11.__proto__.toString='xxx'; Object.prototype.toString='xxx';推荐Object.create()修改原型链
通过该方法,相当于往链上面添加一个节点,该节点可以作为被添加的对象的公共属性;
let common={name:'小红',age:13} let obj12=Object.create(common) obj12.flag=true; 结果就是obj12有一个自身的属性flag,原型链上面,有一个原型对象是common对象;