JS对象

作者: Marshall3572 | 来源:发表于2021-02-25 11:01 被阅读0次

七种数据类型中唯一一种复杂类型。
对象的定义:

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

定义对象的写法:
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代码都是强烈不推荐写的

相关文章

网友评论

      本文标题:JS对象

      本文链接:https://www.haomeiwen.com/subject/dsorfltx.html