JS对象的属性描述符

创建对象的方式

方式一:通过new Object方式创建

js 复制代码
    var obj = new Object()
    obj.name = 'ywq'
    obj.age = 12
    obj.friends = { name: 'yyy', age: 11 }
    obj.action = function() {}

方式二:通过字面量形式创建

js 复制代码
    var obj = {
        name: 'ywq',
        age: 12,
        friends: { name: 'yyy', age: 11 },
        action: function() {}
    }

两种方式都可以创建对象,但是new Object()不建议使用 ,通过代码可以看出代码不够直观阅读性差,属性需要一个一个进行添加

属性描述符-对象的一些用法

js 复制代码
    var obj = { name: '水杯', color: '蓝色', capacity: '800ml' }
  • 获取对象属性的值
js 复制代码
    console.log(obj.name) // 水杯
  • 设置对象某个属性的值/给对象添加新属性
js 复制代码
    obj.color = '粉色'
    obj.shape = 'cylinder'
  • 删除对象的某个属性
js 复制代码
    delete obj.capacity
    console.log(obj) // {name: '水杯', color: '蓝色'}

我们可以对对象的属性进行增/删/改/查,那我们能不能精准的对对象进行操作?(比如:不能对对象的某个属性进行其他操作)

属性描述符 Object.defineProperty() 和 Object.defineProperties()

  • 数据属性描述符 (configurable, enumerable, writable, value)
  • 存取属性描述符 (configurable, enumerable, get, set)

对象的属性描述符分为数据属性描述符和存取属性描述符,两种属性描述符不可共存,只能选择其中一种

写法:

  • Object.defineProperty(要操作的对象, 要操作对象的某个属性, { 数据属性描述符 })
  • Object.defineProperties(要操作的对象, {})
数据属性描述符
  • 属性是否可以删除/重新配置 configurable
js 复制代码
    var obj = { name: "华为手机", color: "白色" }
    Object.defineProperty(obj, 'color', {
        configurable: false,
    });
    delete obj.color;
    console.log(obj);
    console.log(obj) // {name: '华为手机', color: '白色'}

configurable 为false时,无法对配置的对应属性重新修改属性描述符

js 复制代码
    var obj = { name: "华为手机", color: "白色" }
    Object.defineProperty(obj, 'color', {
        configurable: false,
    });
    Object.defineProperty(obj, 'color', {
        configurable: true
    });
    obj.color = '红色'
    console.log(obj) // test.js:5 Uncaught TypeError: Cannot redefine property: color at Function.defineProperty 
  • 属性是否可被枚举 enumerable enumerable为false时,不能被枚举
js 复制代码
    var obj = { name: '华为手机', color: '白色' }
    Object.defineProperty(obj, 'color', {
        configurable: true,
        enumerable: false
    })
    // 1.
    console.log(obj) // { name: '华为手机' }  在控制台中打印
    console.log(obj.color) // 白色

    // 2.
    for(var key in obj) {
        console.log(key) // name
    }
  • 给属性重新赋值 writable writable为false时,不能给属性重新赋值
js 复制代码
    var obj = { name: '华为手机', color: '白色' }
    Object.defineProperty(obj, 'name', {
        configurable: true,
        enumerable: true,
        writable: false
    })
    obj.name = '小米'
    console.log(obj) // { name: '华为手机', color: '白色' }
  • 设置属性的值
js 复制代码
    var obj1 = { name: '华为手机' }
    Object.defineProperty(obj1, 'name', {
        value: 'OPPO手机'
    })
    console.log(obj1) // {name: 'OPPO手机'}
  • 添加新的属性
js 复制代码
    var obj1 = { name: '华为手机' }
    Object.defineProperty(obj1, 'model', {
        value: 'Meta 5'
    })
    console.log(obj1) // {name: '华为手机', model: 'Meta 5'}

`

Object.defineProperty(obj, 'height', {属性描述符}) 属性描述符没有配置时,对象属性的默认配置如下:

  • configurable 默认值:false
  • enumerable 默认值: false
  • writable 默认值:false
  • value 默认值:undefined

字面量对象的属性也有属性描述符,默认都为true,可以通过Object.getOwnProperty(对象, 属性)获取

var obj = { size: '40*40', grade: 'A' } `

  • 对对象多个属性同时添加属性描述符
js 复制代码
    var obj = {}
    Object.defineProperties(obj, {
        name: {
            configurable: true,
            enumerable: true,
            writable: true,
            value: '华为手机'
        },
        color: {
            configurable: true,
            enumerable: true,
            writable: false,
            value: '粉色'
        }
    })
    obj.color = '黑色'
    console.log(obj) // {name: '华为手机', color: '粉色'}

获取对象的所有属性描述符,通过Object.getOwnProperties(obj)

存取属性描述符

存取属性描述符和数据属性描述符相同不同,不再说明

` 对象的存取属性描述符使用场景

  • 和私有属性一同使用
  • 对对象的属性进行截获(vue2响应式原理) `
js 复制代码
    var obj = { name: "ywq", _age: 12 };
    Object.defineProperty(obj, "age", {
        configurable: true,
        enumerable: true,
        get: function () {
            log(obj);
            return this._age;
        },
        set: function (value) {
            change();
            this._age = value;
        },
    });

    function change() {
    console.log("set操作时执行了:", { address: "河南" });
    }
    function log(s) {
    console.log("get操作时执行了:", s);
    }

    obj.age = 18;
    console.log(obj.age);

对象的其他用法

  • Object.preventExtensions(对象名称) 禁止对对象进行扩展,禁止添加新属性
js 复制代码
    var obj = { name: 'ywq', age: 12 }
    Object.preventExtensions(obj)
    obj.age = 23
    obj.sex = '未知'
    obj.height = '未知'
    console.log(obj) // {name: 'ywq', age: 23}
  • Object.seal(对象名称,对象属性) 禁止删除对象的某个属性
js 复制代码
    var obj = { name: 'ywq', age: 12 }
    Object.seal(obj, 'name')
    console.log(obj) // name: 'ywq', age: 12}
  • Object.freeze(对象名称) 冻结某个对象
js 复制代码
    var obj = { name: 'ywq', age: 12 } 
    Object.freeze(obj)
    obj.age = 18
    obj.height = '未知'
    console.log(obj) // {name: 'ywq', age: 12}
相关推荐
还是大剑师兰特43 分钟前
Vue3 中的 defineExpose 完全指南
前端·javascript·vue.js
泯泷1 小时前
阶段一:从 0 看懂 JSVMP 架构,先在脑子里搭出一台最小 JSVM
前端·javascript·架构
华洛2 小时前
利好打工人,openclaw不是企业提效工具,而是个人助理
前端·javascript·产品经理
xkxnq2 小时前
第六阶段:Vue生态高级整合与优化(第93天)Element Plus进阶:自定义主题(变量覆盖)+ 全局配置与组件按需加载优化
前端·javascript·vue.js
A黄俊辉A3 小时前
vue css中 :global的使用
前端·javascript·vue.js
灵感__idea4 小时前
Hello 算法:复杂问题的应对策略
前端·javascript·算法
chushiyunen4 小时前
python中的内置属性 todo
开发语言·javascript·python
soso19685 小时前
JavaScript性能调优实战案例
javascript
Moment5 小时前
前端工程化 + AI 赋能,从需求到运维一条龙怎么搭 ❓❓❓
前端·javascript·面试
Joker Zxc6 小时前
【前端基础(Javascript部分)】6、用JavaScript的递归函数和for循环,计算斐波那契数列的第 n 项值
开发语言·前端·javascript