对象声明
键名/属性名:字符串类型,不是标识符,可以包含任意字符
所有的属性名都会自动转化为字符串
常量(字符串类型)与变量(类型与值都不确定)作属性名区别:
let p = 'name'
let obj = {'p':'chili'} //属性名为'p'
let obj2 = {[p]:'chili'} //属性名为'name'
注意:
- 变量值不为字符串时,属性名会自动转化为字符串
let obj = {[1+2+3]:'chili'} //属性名为'6'
- 加了[]会当成变量求值
- 不加则自动变成字符串
原型:共有属性组成的对象
每一个对象都有隐藏属性,隐藏属性储存着共有属性组成的对象的地址,即隐藏属性储存原先的地址。
查看对象的属性
- obj['key']
- obj.key
注意:
obj[key]中key为变量 不等价于obj.key以及obj['key']
let p = 'name' //obj[p]等价于obj['name']
'xxx' in obj和obj.hasOwnProperty('xxx') 的区别
obj.hasOwnProperty('xxx') //可判断一个属性是自身属性还是共有属性 返回true即为自身属性
'xxx' in obj //查看对象是否有这个属性 但无法判断属性是自身属性还是共有属性
修改对象的属性
修改自身属性--------------- 可直接赋值
obj.name = 'chili'
obj['name'] = 'chili'
obj[name] = 'chili' //错误 name为变量 不确定的值
修改共有属性
obj.toString='xxx' //toString属性是obj对象的自身属性且值为'xxx', 也是共有属性但是值不变,并且读取这个属性时默认先读取自身的属性。
obj2.toString === 'xxx' //返回false 因此不能通过这种方式修改共有属性
- 可通过以下方法修改原型属性
obj.__proto__.toString = 'xxx' //非常不推荐
Object.prototype.toString = 'xxx'
- 可使用Object.create 将一个对象包装为原型
let commom = {style:'huamn'}
let obj = Object.create(common)
obj.name = 'chili'
let obj2 = Object.create(common)
obj.name = 'tom'
不含属性名与属性值为undefined的区别
- 不含属性名
'xxx' in obj //返回false
- 存在属性名且属性值为undefined
'xxx' in obj && obj.xxx //返回undefined
- obj.xxx === undefined 不能确定'xxx'是否为obj的属性
let obj = {}
let obj1 = {xxx:undefined}
obj.xxx === obj1.xxx //返回true