JS对象(Object)

131 阅读2分钟

JS对象(Object)


定义:

  • 无序的数据集合
  • 键值对的集合

写法:

  • let obj = {'name':'hao','age':18}
  • let obj = new Object({'name':'hao')}
  • console.log({'name':'hao','age':18})

细节:

  1. 键名是字符串,不是标识符,可以包含任意字符
  2. 引号可省略,省略之后,只能以标识符规则来写
  3. 引号省略,键名还是字符串
  • 属性名:每个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的属性

查看所有属性

查看自身所有属性

  1. Object.keys(obj) 查属性名
  2. Object.value(obj) 查属性值
  3. 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'