JS-对象

作者: 刘淘 | 来源:发表于2020-06-17 23:46 被阅读0次

    1. 基础

    • 可通过字面量定义对象,在对象内部定义属性和方法
    • 可以通过对象.属性或者对象['属性'] 对象['方法']来访问对象成员,可使用delete删除对象成员
    • 当属性或者方法是动态的或者不符合标准命名是,只能使用对象['属性/方法']来访问
    • 对象是引用类型,当对象赋值或者作为函数参数时,都是传递引用地址,赋值后或经函数调用后都会发生变化
    const user={
       name:'夏目',
       age:18,
       show(){
           console.log(`${this.name} is ${this.age} years old.`)
       },
    }
    console.log(`${user.name} is ${user.age} years old.`)
    user.age=33
    console.log(`${user.name} is ${user.age} years old.`)
    delete user.name //删除对象属性
    console.log(`${user.name} is ${user.age} years old.`)
    //for in 遍历对象
    for (const key in user){
       console.log(key,user[key])  //当属性名是动态的时候,通过对象[属性名]来访问
    }
    
    image.png
    //基础类型与引用类型
    function add(a){
        a+=10
        console.log('add',a)
    }
    function addProp(obj){
        obj.age=18
        console.log('addPros',JSON.stringify(obj))
    }
    
    const a=1,obj={name:'夏目'}
    
    add(a)
    ////对象是引用类型,当对象当作参数传递时候,传递的其实是引用地址,赋值后或者经函数调用后都会发生改变
    addProp(obj) 
    
    image.png

    2.属性

    • 对象可通过. 或者[' ']来动态添加新属性,使用delete来删除对应的属性
    const user={}
    user.name='xiamufe'
    user['age']=18
    console.log(JSON.stringify(user))
    delete user.age
    console.log(JSON.stringify(user))
    
    image.png
    • 对象可通过hasOwnProperty()检测自身包含的属性,通过in检测自身和原型链上的属性
    const user={}
    user.name='xiamufe'
    user['age']=18
    console.log(user.hasOwnProperty('name')) //hasOwnProerty 检测对象自身是否包含某个属性
    const address={address:'熊本县'}
    Object.setPrototypeOf(user,address)
    console.log(user.hasOwnProperty('address')) //hasOwnProerty 检测对象自身是否包含某个属性
    console.log('address' in user) //使用in 检测某个属性是否在对象和对象原型链上
    
    • 可将对象数组转化为对象(一般通过reduce进行累积获得)
    //将对象数组转化为对象
    const users = [{type:'人类', name: '夏目', age: 17 }, {type:'高级妖怪', name: '猫咪老师', age: 100 }]
    const obj = users.reduce((preV, currentV, index) => {
        const prop = `${currentV['type']}`
        console.log(prop)
        return {...preV,[prop]:currentV}//???????
    },{}) //初始值是空对象
    console.log(JSON.stringify(obj,null,2))
    
    image.png
    • 可使用Object.assign()生成一个新的对象,也可用于参数合并(对象解构,默认值都可实现)
    function upload(params) {
        const config = { type: '.jpg,.png', size: 2000 }
        const res = Object.assign({}, config, params)
        console.log(JSON.stringify(res))
    }
    upload()
    upload({ type: '.gif' })
    
    
    
    const user = { type: '人类', name: '夏目', age: 17 }
    console.log(Object.keys(user))
    console.log(Object.values(user))
    console.log(Object.entries(user))
    
    for (const [key, val] of Object.entries(user)) {
        console.log(key, val)
    }
    
    for (const key of Object.keys(user)) {
        console.log(key)
    }
    
    for (const key in Object.keys(user)) {
        console.log(key)
    }
    
    for (const key in(user)) {
        console.log(key)
    }
    //for of 遍历数组 ,不可以遍历对象 for in可以遍历对象
    
    2.1属性特征
    • 可通过Object.getOwnPropertyDescriptor(s)查看对象的(所有)属性特征(值,可修改,可遍历,是否可删除或重复配置)
    • 可通过Object.defineProperty()新增属性,配置属性特征(是否可修改,可遍历,是否可删除或重复配置)
    • 可通过Object.defineProperties()批量配置对象的多个属性特征
     'use strict'
        const user = { name: 'xiaomu', age: 18 }
        console.log(Object.getOwnPropertyDescriptor(user, 'name'))    // {value: "xiaomu", writable: true, enumerable: true, configurable: true}
        console.log(JSON.stringify(Object.getOwnPropertyDescriptors(user), null, 2))
        // {
        //   "name": {
        //     "value": "xiaomu",
        //     "writable": true,
        //     "enumerable": true,
        //     "configurable": true
        //   },
        //   "age": {
        //     "value": 18,
        //     "writable": true,
        //     "enumerable": true,
        //     "configurable": true
        //   }
        // }
        // 为user对象新增web属性
        Object.defineProperty(user, 'web', {
          value: 'xiaomuxiaomu'
        })
        console.log(user)                                             // {name: "xiaomu", age: 18, web: "xiaomuxiaomu"}
        // 配置user属性不可修改(默认true)
        Object.defineProperty(user, 'web', {
          writable: false
        })
        // user.web = 'xiaomuxiaomu'            // 严格模式下报错,非严格模式忽略
        // 配置user属性不可遍历(默认true)
        Object.defineProperty(user, 'web', {
          enumerable: false
        })
        console.log(Object.keys(user))                                // ["name", "age"]
        for (const key in user) {
          console.log(key)                                            // user,age
        }
        // 配置user属性不可配置(默认true)
        Object.defineProperty(user, 'web', {
          configurable: false
        })
        // delete user.web                                            // 严格模式下报错,非严格模式忽略
        // Object.defineProperty(user, 'web', {
        //   configurable: true
        // })
        Object.defineProperties(user, {
          name: {
            writable: false,
            enumerable: false,
            configurable: true
          },
          age: {
            writable: false,
            enumerable: false,
            configurable: true
          }
        })
        console.log(Object.keys(user))                                // []
    
    2.2属性保护

    相关文章

      网友评论

          本文标题:JS-对象

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