1. 声明对象的两种语法
let obj = {'name': 'xxx', 'age': 25 } //简单写法
let obj = new Object ({'name': 'xxx', 'age': 25 }) //标准写法
注意:
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可省略,省略之后就只能写标识符
- 就算引号省略了,键名也还是字符串!!!
2.属性的增删查改
1. 如何删除对象的属性
delete obj.xxx 或 delete obj['xxx']
检测一个对象是否含有属性名:
'xxx' in obj === false //不含属性名
'xxx' in obj && obj.xxx === undefined //含有属性名,但是其值为undefined
注意:
obj.xxx === undefined不能断定'xxx'是否为obj的属性可能有两种情况:
- 不含属性名;
- 含有属性名,其值为
undefined
2. 如何查看对象的属性
查看某一个属性:
obj['key'] //中括号语法
obj.key //点语法,点语法会误导你,让你以为key不是字符串,等确定不能弄混两种语法再改用点语法
obj[key] //查看某一个属性:坑新人语法,因为变量key值一般不为'key'
查看自身所有属性:
Object.keys(obj)
查看自身+共有属性:
console.dir(obj)
依次用Object.keys打印出obj.__proto__
判断某个属性为自身的还是共有的:
obj.hasOwnProperty('xxx')
3. 如何修改或增加对象的属性
注意: 增改放一起是因为大部分用法基本一样:已有属性则改;没有属性则增。
直接赋值:
let obj = {name: 'xxx' } //name是字符串
obj.name = 'xxx' //name是字符串
obj['name'] = 'xxx'
obj[name] = 'xxx' //错,因为name值不确定
obj['na'+'me'] = 'xxx'
let key = 'name'; obj[key] = 'xxx'
let key = 'name'; obj.key = 'xxx' //错,因为obj.key等价于obj['key']
批量赋值:
Object.assign(obj, {name: 'xxx', age :18 })
修改或增加共有属性:
注意: 一般来说不推荐修改原型,会引起很多问题
obj.__proto__.toString = 'xxx' //强烈不推荐用__proto__
Object.prototype.toString = 'xxx'
注意: 无法通过自身来修改或增加共有属性
let obj ={}, obj2= {} //共有属性toString
obj.toString = 'xxx' //只会修改obj自身属性,obj2.toString还是在原型上
修改隐藏属性:
let obj = {name: 'aaa'}
let obj2 = {name: 'bbb'}
let common = {kind:'human'}
obj.__proto__ = common
obj2.__proto__ = common
let obj = Object.create(common)
obj.name = 'aaa'
let obj2 = Object.create(common)
obj2.name = 'bbb'
注意:
不推荐使用__proto__,推荐使用Object.create。需要改建议开始改,别后来再改。
3. 'name' in obj和obj.hasOwnProperty('name') 的区别
'name' in obj是判断obj对象里是否含有name属性名的属性。obj.hasOwnProperty('name')是判断一个属性是自身的还是共有的。