一、声明对象的两种语法
写法:
let obj={'name':'XXX','age':'XXX'}
let obj=new Object({'name':'XXX'})
console.log({'name':'XXX','age':'XXX'})
注意:
-
键名是字符串,不是标识符,可以包含任意字符
-
引号可以省略,省略之后只能写标识符
-
引号省略之后,键名也还是字符串
属性名:每个key都是对象的属性名(property)
属性值:每个value都是对象的属性值
所有的属性名会自动变成字符串
变量作属性名加[]
let p1='name'
let obj={p1:'XXX'} //属性名为'p'
let obj={[p1]:'XXX'} //属性名为'name'
注意:
-
不加[ ]的属性会自动变成字符串,加了[ ]会当做变量求值
-
值如果不是字符串,则会自动变成字符串
对象的隐藏属性
JS中每一个对象都有一个隐藏属性,这个隐藏属性储存着其共有属性组成的对象的地址,这个共有属性组成的对象叫做原型,也就是说,隐藏属性储存着原型的地址。
var obj={}
obj.toString() //不报错
因为obj的隐藏属性对应的对象上有toString()
二、如何删除对象的属性
delete obj.XXX或delete obj['XXX']即可删除obj的XXX属性
delete删除属性和值,一般只用来删除属性,undefined删除值
注意:obj.XXX===undifined不能断定'XXX'是否为obj属性
三、如何查看对象的属性
-
查看自身所有的属性:
Object.keys(obj) -
查看自身+共有属性:
console.dir(obj)或Object.keys打印obj.__proto__ -
判断一个属性是自身还是共有:
obj.hasOwnProperty('toString')
查看属性的方式:
中括号语法:obj['key']
点语法:obj.key
优先使用中括号语法
四、如何修改或增加对象的属性
- 直接赋值
let obj={name:'XXX'} //name是字符串
obj.name='XXX' //name是字符串
obj['name']='XXX'
obj['na'+'me']='XXX'
let key = 'name';obj[key]='frank'
- 批量赋值
object.assign(obj,{a:1,b:2,c:3})
- 共有属性无法通过自身修改或增加
let obj={},obj2={} //共有toString
obj.toString='XXX'只会修改obj自身属性,obj.toString还是在原型上
- 修改或增加原型上的属性
obj.__proto__.toString='XXX'`//不推荐
Object.prototype.toString='XXX'
一般不修改原型,容易引起问题
- 修改隐藏属性
__proto__
let obj={name:'XXX'}
let obj={name:'YYY'}
let common={kind:'human'}
obj.__proto__=common
obj2.__proto__=common
Object.create
let obj=Object.create(common)
obj.name='XXX'
let obj2=Object.create(common)
obj2.name='YYY'
五、'name' in obj和obj.hasOwnProperty('name') 的区别
都是两种查看属性是不是在对象里的方法
前者自身属性和共有属性都返回true,后者仅仅是自身属性才返回true