一、声明对象的两种方法(对象:无序的数据集合&键值对的集合)
·简易声明:let obj = { 'name' : '李雷' , 'age': '12' }
·正规声明:let obj = new Object ( { 'name' : '韩梅梅' } )
·注意细节:
1.键名是字符串,不是标识符,可包含任意字符;
2.引号可省略,省略之后就只能写标识符;
3.即使引号省略,键名也还是字符串(重要)。
二、如何删除对象的属性
删除方法:delete obj.xxx 或 delete obj['xxx']
注意细节:
1.不含属性名
'xxx' in obj === false
2.含有属性名,但是值为undefined
'xxx' in obj && obj.xxx===undefined
3.注意 obj.xxx === undefined 不能断定 'xxx'是否为obj的属性
三、如何查看对象的属性
·查看对象自身所有属性 : Object.keys(obj)
·查看自身+共有属性:console.dir(obj) 或依次用Object.keys打印出 obj.__proto__
·判断一个属性是自身的还是共有的:obj.hasOwnProperty('toString')
·中括号语法: obj['key']
·点语法:obj.key
优先使用中括号语法
四、如何修改或增加对象的属性
·直接赋值: let obj = { name: ‘李雷’ } obj.name = '李雷' obj['name'] = '李雷'
·批量赋值:Object.assign(obj,{age: 18,gender:male})
·无法通过自身修改或增加共有属性,只会改自身属性,不影响原型的属性。
·obj.__proto__.toString='xxx' //不推荐用__proto__
·Object.prototypee.toString='xxx' 通常不要修改原型,会引起很多问题。
·推荐使用Object.create 修改隐藏属性
let common = {kind:'human'}
let obj = Object.create(common)
obj.name='李雷'
let obj2 = Object.create(common)
obj2.name='韩梅梅'
规范大概的意思是,要改就一开始就改,别后来再改
五、'name' in obj 和obj.hasOwnProperty('name')的区别
1.在某个对象是否拥有某个属性,判断的方法有很多,常用的方法就是object.hasOwnProperty('×××'),这个方法是不包括对象原型链上的方法的,举个例子:
let obj = {name:'lei'}
console.log(obj.hasOwnProperty('name')) //true
console.log(obj.hasOwnProperty('toString')) //false
在这个例子中,obj对象存在的name属性的时候,调用这个方法才是返回true,我们知道其实每个对象实例的原型链上存在toString方法,在这里打印false,说明这个方法只是表明实例对象的属性,不包括原型链上的属性。
2.下面我们再来看看in的使用,例子如下:
let obj2 = { name:'mei'}
console.log('toString' in obj2) //true
我们可以看到,其实在这个例子中,我只是给了对象一个属性name,并没有其他的属性,然后我执行'tiString' in obj,可以看出控制动态打印出来的是true,原因就是对象的原型链上存在toString方法,所以in操作不管是不是原型链上,只要存在这个属性,返回的就是true。