Object 唯一一种复杂类型
定义
-
无序的数据集合
-
键值对集合
-
let obj = new Object({'name': 'frank'})
-
let obj = {key: value}
-
key 只能是 字符串, 即使没有引号, 也是字符串
-
-
细节
-
键名是字符串, 不是标识符, 可以包含任意字符
-
键名引号可以省略, 省略之后只能是标识符
-
如果你想用 变量 当做key, 声明如下
-
let name = 'sun' let obj = { [a]: 111 }
-
关乎原型链的隐藏属性
-
JS 中每一个对象都有一个
隐藏属性 -
这个
隐藏属性存储着其共有属性组成的对象的 地址 -
这个
共有属性组成的对象叫做 原型 -
也就是说,
隐藏属性存储着原型的 地址
删除属性
-
delete: 删除属性名 -
let obj = {name: 'frank', age: 18}delete obj.nameobj // {age: 18}// 这个也是删除, 没有name, 也不报错// JS真狗delete obj["name"]
-
// 判断name是不是obj的属性名"name" in obj // false
读属性
-
Object.keys()只要key组成的数组 -
let obj = {name: 'frank', age: 18}Object.keys(obj) // ["name", "age"]
-
Object.values()只要value组成的数组 -
let obj = {name: 'frank', age: 18}Object.values(obj) // ['frank', 18]
-
Object.entires()包含key数组和value数组的数组 -
let obj = {name: 'frank', age: 18}Object.entires(obj) // [["name", "age"], ['frank', 18]]
-
in & hasOwnProperty区别- "toString" in obj
// trueobj.hasOwnProperty("toString")
// falsein 意思是是否有这个属性, 不管你是不是共有, 只要有就行hasOwnProperty 意思是拥有自己的属性么?注意: 共有属性不是自己的属性, 所以他没有toString
- "toString" in obj
-
查看属性的方法
- obj["name"]obj["na"+"me"]obj.nameobj[name] // 这里的name是个变量, 不一定是什么, 和上面不一样
原型
-
每个对象都有原型
-
原型里存着对象的共有属性
-
比如
obj的原型就是一个对象 -
obj.__proto__存着这个 原型的地址 -
这个原型对象里有
toString / constructor / valueOf等属性
-
-
对象的原型也是对象
-
所以对象的原型也有原型
-
obj 的原型对象 是所有对象的 原型对象
-
这个原型包含所有对象的共有属性, 是对象的根
-
这个原型也有原型, 是null
-
let obj = {}obj__proto__ 会找到原型对象Object的共有属性 /* obj.proto === Object.prototype //true*/ Object里还有__proto__, 找到是null /* obj.proto.proto // null*/
-
修改 或 增加
-
修改 还是 增加?
- let obj = {name: 'frank', age: 18}obj["name"] = 'frank1' // 这是修改 等价 obj.nameobj["names"] = "frank" // 这是增加 等价 obj.names修改还是增加, 要看obj里面是否存在
-
我要一次性加很多属性
- Object.assign()
// assign的意思就是赋值 // 小例子 // 意思就是将p1,p2,p3,p4全部赋值给objObject.assign(obj,{p1:1, p2:2, p3:3, p4:4})
- Object.assign()
-
我能不能通过obj改变原型里面的共有属性
-
obj.toString = 'xxx'obj2.toString
// function toString(){}看到上面明显发现是不能的, JS做了一个处理就是读的时候, 会读到共有属性修改的时候, 不会修改共有属性, 而是将obj里面加上自己的属性 -
无法通过自身修改或增加
共有属性 -
我不服, 我偏要改了他
-
obj.__proto__.toString = 'xxx'改了......不建议改 -
我就想改咋办?? 用
window.Object.prototype修改 -
ES6提供了一个方法,
Object.create() -
let common = {"国际": "中国", hairColor: 'bilck'}let person = Object.create(common) // 意思就是以common为原型创建一个personconsole.dir(person)
// proto:{"国际": "中国", hairColor: 'bilck', proto:{}}如果要给person加属性有两种方法person.name = 'xxx'或let person = Object.create(common,{name: {value:"xxx"}})Object.create() 的第二个参数是给person添加属性, 但是写法有些别扭
-