Object.defineProperty 的基本使用

defineProperty 方法的特点

  可以直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。

defineProperty 用法

  • Object.defineProperty(obj, prop, descriptor)
  • obj:需要操作的对象
  • prop:需要操作的属性
  • descriptor:属性描述符
Object.defineProperty(obj, 'name', {
    // 可以通过 value 来告诉 defineProperty 方法新增的属性的取值是什么
    value: 'tanran',
    // 默认情况下通过 defineProperty 新增的属性的取值是不能修改的
    // 如果想修改, 那么就必须显示的告诉 defineProperty 方法
    writable: true,
    // 默认情况下通过 defineProperty 新增的属性是不能删除的
    // 如果想删除, 那么就必须显示的告诉 defineProperty 方法
    configurable: true,
    // 默认情况下通过 defineProperty 新增的属性是不能迭代的
    // 如果想迭代, 那么就必须显示的告诉 defineProperty 方法
    enumerable: true
});

defineProperty 方法

  1. defineProperty 除了可以动态修改 / 新增对象的属性以外
    还可以在修改 / 新增的时候给该属性添加 get/set 方法
  2. defineProperty get/set 方法特点
    只要通过 defineProperty 给某个属性添加了 get/set 方法
    那么以后只要获取这个属性的值就会自动调用 get, 设置这个属性的值就会自动调用 set
  3. 注意点:
    如果设置了 get/set 方法, 那么就不能通过 value 直接赋值, 也不能编写 writable: true
    let obj = {};
    let oldValue = '坦然';
    Object.defineProperty(obj, 'name', {
        // value: oldValue,
        // writable: true,
        configurable: true,
        enumerable: true,
        get(){
            console.log("get方法被执行了");
            return oldValue;
        },
        set(newValue){
            if(oldValue !== newValue){
                console.log("set方法被执行了");
                oldValue = newValue;
            }
        }
    });
    console.log(obj.name); // get方法被执行了   坦然
    obj.name = 'tanran'; // set方法被执行了
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Object.defineProperty是一个用来在一个对象上定义新属性或者修改已存在属性的方法。[2]它可以通过设置属性的描述符来控制属性的行为,包括属性的可枚举性、可配置性、可写性以及属性的值等。通过使用Object.defineProperty,我们可以实现对对象属性的监听和控制,从而实现双向数据绑定。 举个简单的例子,假设我们有一个名为person的对象,其中包含name和age两个属性,我们可以通过使用Object.defineProperty来添加一个新的属性sex,并设置它的值为男。代码如下: let person = { name:"码农", age: 18 } Object.defineProperty(person,'sex',{ value:"男" }) console.log(person) 运行以上代码,我们可以在控制台中看到person对象中已经添加了一个名为sex的属性,其值为男。这就是Object.defineProperty基本用法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue源码学习之Object.defineProperty对象属性监听](https://download.csdn.net/download/weixin_38663151/14904644)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Object.defineproperty方法(详解)](https://blog.csdn.net/weixin_57677300/article/details/126278467)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值