七种数据类型中唯一一种复杂类型。
对象的定义:
- 无序的数据集合
- 键值对的集合
定义对象的写法:
let obj = {'name' : 'frank', 'age' : '18'}
let obj = new Object({'name' : 'frank'})
console.log({'name' : 'frank', 'age' : '18'})
- 键名是字符串,不是标识符,可以包含任意字符
- 就算引号省略了,键名也还是字符串。(重要)
- 如果引号省略了,只能按标识符的规则写,就不能加特殊字符。
如何用变量做属性名
let p1 = 'name'
let obj = {p1:'frank'}这样写,属性名为'p1'
let obj = {[p1]:'frank'}这样写,属性名为'name'
不加[ ]的属性名会自动变成字符串
加了[ ]则会当做变量求值,然后将其变成字符串
隐藏属性
JS中每一个对象都有一个隐藏属性,这个隐藏属性存储着其共有属性组成的对象的地址,这个共有属性组成的对象叫做原型。也就是说,隐藏属性存储着原型的地址。
增删改查
删除属性
delete obj.xxx 或 delete obj['xxx']
不含属性名
'xxx' in obj === false(不区分是自己的还是共有的属性)
含有属性名,但是值为undefined
'xxx' in obj && obj.xxx === undefined
注意:obj.xxx === undefined
不能断定'xxx'是否为obj的属性
查看属性
obj['key']
obj.key
注意:key是字符串
取决于key是键值还是变量
原型
三段论:对象都有原型,原型也是对象,可以推出原型也有原型,这个原型包含所有对象的共有属性,是对象的根null。

写属性
批量赋值
Object.assign(obj,{age: 18,gender: 'man'})
无法通过自身修改或增加共有属性
例如:obj.toString = 'xxx'只会改obj自身属性,不改原型。
理论上原型的属性也可以通过obj.proto.toString = 'xxx'修改(不推荐使用proto)
Object.protoTyle.toString='xxx'
但是不建议修改,会出现很多意想不到的问题。
创建原型链

- 不推荐使用proto
let obj = {'name' : 'frank'}
obj.proto = common - 推荐使用Object.create
let obj = Object.create(common)
obj.name = 'frank'
也就是说,要创建原型链一开始就创建,别后来再改。
总结
- 删
delete obj['name']
'name' in obj //false (这种方法无法判断属性是自身的还是共有属性,判断自身属性用下边这种)
obj.hasOwnProperty('name')//false - 查
Object.keys(obj)
console.dir(obj)
obj['name']
obj.name //这里的name是字符串
obj[name] //这里的name是变量 - 改
改自身obj['name']='jack'
批量改自身Object.assign(obj,{age:18,...})
改共有属性obj.proto['toString'] = 'xxx'
Object.prototype('toString') = 'xxx'
改原型
obj.proto = common
let obj = Object.create(common)
所有proto代码都是强烈不推荐写的
网友评论