JS对象 前端第一座大山

73 阅读3分钟
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")
      // false​in 意思是是否有这个属性, 不管你是不是共有, 只要有就行​hasOwnProperty 意思是拥有自己的属性么?注意: 共有属性不是自己的属性, 所以他没有toString
  • 查看属性的方法

    • obj["name"]obj["na"+"me"]obj.name​obj[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})
  • 我能不能通过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添加属性, 但是写法有些别扭