JS对象(Object)
定义:
- 无序的数据集合
- 键值对的集合
写法:
- let obj = {'name':'hao','age':18}
- let obj = new Object({'name':'hao')}
- console.log({'name':'hao','age':18})
细节:
- 键名是字符串,不是标识符,可以包含任意字符
- 引号可省略,省略之后,只能以标识符规则来写
- 引号省略,键名还是字符串
- 属性名:每个key都是对象的属性名(property)
- 属性值:每个value都是对象的属性值
- Object.keys(obj) 可以得到obj的所有键名
- 变量做属性名
- 变量加[]
- 不加[}属性名会自动变为字符串
- 加[]会当做变量求值
- 值如果不是字符串会自动变成字符串
对象的隐藏属性
- JS中每个对象都有隐藏属性
- 这个隐藏属性存着其公有属性组成的对象的地址
- 这个公有属性组成的对象叫原型
- 隐藏属性都存着原型的地址
增删改差(对象的属性)
删除属性
-
delete obj. xxx 或 delete obj . ['xxx']
- 可删除obj的xxx属性
-
不含属性名
- 'xxx' in obj ===false
-
含属性名
- 'xxx' in obj && obj.xxx === undefined
-
注意obj.xxx =undefined
- 不能断定xxx是否为obj的属性
查看所有属性
查看自身所有属性
- Object.keys(obj) 查属性名
- Object.value(obj) 查属性值
- Object.entries(obj) 查key和value
查看自身和隐藏属性
- console.dir(obj)
判断一个属性是自身的还是共有的
- obj.hasOwnProperty('toString')
obj.hasOwnProperty('toString') 如果是共有的 私有没有 也会返回false
'name' in obj 共有私有不分 只要有name属性就会显示true\
原型
-
每个对象都有原型
- 原型里存着对象的公有属性
- obj的原型就是一个对象
- obj.--proto--存着这个对象的地址
- 对象里有toString|valueOf等属性
-
对象的原型也是对象
- 对象的原型也有原型
- obj={}的原型即为所有对象的原型
- 这个原型包含所有对象的共有属性,是对象的根
- 这个原型也有原型,是null
两种方法查看属性
- 中括号语法:obj['key']
- 点语法:obj.key
修改和删除属性
- 批量复制
- Object.assign(obj,[name:hao,age:22])
修改或增加共有属性
-
无法通过自身修改或增加共有属性
- let obj = {}, obj2= {} //共有toString
- obj.toString = 'xxx' 只会在改obj自身属性
- obj2.toString 还是在原型上
-
我偏要修改或增加原型上的属性
- obj.proto.toString = 'xxx' //不推荐用__proto__
- Object.prototype.toString = 'xxx'
- 一般来说,不要修改原型,会引起很多问题
修改隐藏属性
推荐使用Object.create
let obj = Object.create(common)
obj.name = 'frank'
let obj2 = Object.create(common)
obj2.name = 'jack'