Object.defineProperty详解!为什么会被vue3被抛弃?

简介: 【10月更文挑战第4天】Object.defineProperty详解!为什么会被vue3被抛弃?

vue中的defineProperty简介

在 Vue.js 中,Object.defineProperty 是一个非常重要的工具,特别是在 Vue 2.x 的响应式系统中。Vue 2.x 使用 Object.defineProperty 来劫持对象属性的 getter 和 setter,从而能够在数据变动时做出响应。

defineProperty的作用

静态方法Object.defineProperty() 直接在对象上定义新属性,或修改对象上现有的属性,并返回该对象。

语法:

Object.defineProperty(obj, prop, descriptor)

参数

默认值/子属性 默认值 含义
obj 要在其上定义属性的对象。 Object
prop 要定义或修改的属性的名称或名称。 sting
descriptor 正在定义或修改的属性的描述符。Object configurable false 是否可以删除或编辑
enumerable false 能否枚举
value undefined**
writable false 能否修改
get
set

创建一个对象obj,并定义一些值。再创建一个空对象target

var obj = {
   
        count : 0,
        list : [1,2,4]
}
var target = {
   };

它主要有以下几个功能:

功能一:通过value设置属性值

由于Object.defineProperty可以给对象定义属性,我们通过value,可以动态地将obj对象的属性动态地添加给target中。

for (let key in obj){
   
        Object.defineProperty(target,key,{
   
                value: obj[key]
        })
}
console.log(target);

输出结果:
成功获取到了obj中的属性值

功能二:通过writable设置是否可写/修改

1.当writable的值为false时

尝试将count的值从0改为10

for (let key in obj){
   
    Object.defineProperty(target,key,{
   
            value: obj[key],
            writable: false
    })
}
target.count = 10;//将count中的值0修改成10
console.log(target.count);  //0  当writable为false时,无法改变count的值

当writable为false时,无法改变count的值

2.当writable的值为true时
尝试将count的值从0改为10

    for (let key in obj){
   
            Object.defineProperty(target,key,{
   
                value: obj[key],
                writable: true
            })
        }
        target.count = 10;//将count中的值0修改成10
        console.log(target.count);  //10

功能三:通过enumerable设置属性值是否允许遍历

在上面的代码基础上,我们添加enumerable属性并尝试遍历target中的属性值

1.当enumerable的值为false时

       for (let key in obj){
   
            Object.defineProperty(target,key,{
   
                value: obj[key],
                writable:true,
                enumerable: false
            })
        }
        for (key in target){
   
                console.log(key);//遍历target中的属性值并打印,此时结果为空
        }

2.当enumerable的值为true时

   for (let key in obj){
   
            Object.defineProperty(target,key,{
   
                value: obj[key],
                writable:true,
                enumerable: ture
            })
        }
        for (key in target){
   
                console.log(key);//遍历target中的属性值并打印,此时结果为空
        }

输出结果:
成功遍历对象并打印出结果

功能四:通过configurable设置属性是否可删

在上面的代码基础上,我们添加configurable属性并尝试用delete方法删除target中的属性

1.当configurable的值为false时

for (let key in obj){
   
        Object.defineProperty(target,key,{
   
                value: obj[key],
                writable:true,
                enumerable: false,
                configurable: false
        })
}
delete target.count;//删除count属性
console.log(target);

输出结果:
由于此方法为fasle时,属性值无法删除,target中仍有count属性

2.当configurable的值为true时

 for (let key in obj){
   
            Object.defineProperty(target,key,{
   
                value: obj[key],
                writable:true,
                enumerable: false,
                configurable: true
            })
        }
delete target.count;//删除count属性

功能五:通过get方法获取属性的值

【注意!】当设置get方法时,不能有value和writable方法,否则会报错
get方法的值是一个函数,此函数不需要参数

 for (let key in obj){
   
    Object.defineProperty(target,key,{
   
            //value: obj[key],
            //writable:true,
            enumerable: false,
            configurable: true,
            get: function(){
   
                    return obj[key]
            }
    })
}
console.log(target.count);

输出结果:
成功获取到了指定属性(count)的值

功能六:通过set方法设置属性的值

set方法的值也是一个函数,定义时会自动注入一个参数,此参数会设置属性的值

for (let key in obj){
   
    Object.defineProperty(target,key,{
   
        //value: obj[key],
        //writable:true,
        enumerable: false,
        configurable: true,
        get: function(){
   
                return obj[key]
        }set: function(val){
   
                console.log(val);//打印设置好的值
            }
    })
}
target.count = 10;//修改count属性的值为10

输出结果:
成功修改了指定属性(count)的值

【注意】set方法只有在设置/修改指定属性值的时候,才会触发,即调用set下的匿名函数

vue2为什么使用Object.defineProperty

通过上述Object.defineProperty的使用介绍,我们可以知道,Vue 2.x 的响应式系统选择使用 Object.defineProperty ,主要是基于以下原因:

  1. 兼容性Object.defineProperty 是 ECMAScript 5.1 标准的一部分,因此在 Vue 2.x 发布时,它具有很好的浏览器兼容性。这使得 Vue 能够在多种浏览器环境中运行,而无需使用额外的转换工具或库。
  2. 实现简单:使用 Object.defineProperty 可以直接在一个对象上定义新属性,或者修改一个对象的现有属性,并为其添加 getter 和 setter。这使得 Vue 可以轻松地拦截属性的访问和修改,从而实现数据的响应式更新。
  3. 性能考虑:虽然 Object.defineProperty 在某些情况下可能不是最优的选择(例如,当需要频繁添加或删除属性时),但在 Vue 的应用场景中,它通常能够提供足够的性能。Vue 主要用于构建用户界面,而不是进行大量的数据操作,因此 Object.defineProperty 的性能限制在 Vue 的上下文中通常是可以接受的。
  4. 与 Vue 的设计目标相契合:Vue 的设计目标之一是使开发者能够轻松地构建用户界面,而无需深入了解底层技术细节。使用 Object.defineProperty 可以帮助 Vue 隐藏这些底层细节,使开发者能够更专注于构建用户界面。

为什么Vue3废弃了Object.defineProperty

Vue3废弃Object.defineProperty,一部分原因就是因为其有其局限性。

例如,它不能检测对象属性的添加或删除,也不能很好地处理数组索引和长度的变化。

为了解决这些问题,Vue 提供了一些额外的工具和方法(如 Vue.setVue.delete 和一些特殊的数组方法),但这些方法需要开发者显式地调用。

因此,在 Vue3.x 中,响应式系统得到了改进,使用了 Proxy 而不是 Object.defineProperty

Proxy 可以提供更全面和灵活的数据劫持能力,能够检测更多的数据变动情况,包括对象属性的添加和删除以及数组索引和长度的变化。这使得 Vue 3.x 的响应式系统更加强大和易用。

相关文章
|
28天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
4天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
453 17
|
7天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
20天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
8天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
392 3
|
22天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
24天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2603 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
300 2
|
5天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
106 65
|
24天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1582 17
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码