Vue08-数据代理

news2024/11/19 1:28:59

一、Object.defineProperty()

Object.defineProperty() 是 JavaScript 中的一个方法,用于直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。

这个方法允许你精确地控制一个对象的属性,包括它的值、是否可写、是否可枚举以及是否可配置。

Object.defineProperty() 方法接受三个参数:

  1. obj:要定义属性的对象。
  2. propertyName:要定义或修改的属性的名称或 Symbol。
  3. descriptor:这个属性的描述符。

descriptor 对象可以具有以下属性:

  • value:属性的值。
  • writable:如果为 true,属性的值可以被重写。默认为 false
  • enumerable:如果为 true,则属性会被枚举(例如,通过 for...in 循环或 Object.keys())。默认为 false
  • configurable:如果为 true,则属性的类型可以被改变,并且属性可以从对应的对象上被删除。默认为 false
  • get:一个函数,当访问该属性时,该函数会被调用,并返回有效的值。
  • set:一个函数,当修改该属性时,该函数会被调用,使用传入的新值作为唯一的参数。

注意:

你不能同时在一个描述符中设置 value 或 writable 与 get 或 set,因为这会导致错误。

        let obj = {};  
  
        Object.defineProperty(obj, 'example', {  
            value: 'Hello',  
            writable: false,  
            enumerable: true,  
            configurable: true  
        });  
            
        console.log(obj.example); // 输出 "Hello"  
        console.log(obj);
            
        // 尝试修改属性会失败,因为它是不可写的  writable: false,  
        obj.example = 'World';  
        console.log(obj.example); // 仍然输出 "Hello" 

二、Object.keys()函数

Object.keys() 是 JavaScript 中的一个内置方法,它返回一个表示给定对象所有可枚举属性的字符串数组。

(其枚举顺序与使用 for...in 循环的顺序相同,两者的主要区别是 for-in 循环还会枚举原型链中的属性)。

const person = {  
    firstName: 'John',  
    lastName: 'Doe',  
    age: 50,  
    eyeColor: 'blue'  
};  
  
const keys = Object.keys(person);  
  
console.log(keys);  
// 输出: ['firstName', 'lastName', 'age', 'eyeColor']

注意事项

  1. 1、原型链Object.keys() 方法只返回对象本身的属性(不包括继承自原型的属性)。

  2. 2、可枚举性:如果属性不可枚举(即它们的 enumerable 属性被设置为 false),那么 Object.keys()不会返回这些属性。

  3. 3、数组和对象:虽然 Object.keys() 主要用于对象,但它也可以用于数组,因为数组在 JavaScript 中也是对象。但是,对于数组,它返回的是索引(作为字符串),而不是值。

  4. const arr = ['a', 'b', 'c'];  
    console.log(Object.keys(arr)); // 输出: ['0', '1', '2']

    4、null 和 undefined:如果尝试在 null 或 undefined 上使用 Object.keys(),将会抛出一个错误。

三、使用Object.defineProperty()的好处

3-1、控制属性是否可枚举

颜色不一样了,意味着:这个属性不可枚举。

3-2、控制属性是否可以被修改

3-3、控制属性是否可以被删除

3-4、小结

3-5、getter属性

3-6、setter属性

3-7、小结

四、数据代理

通过obj2,读取、修改obj的x属性。

五、Vue中的数据代理

5-1、ES6:属性名简写(Property Shorthand)的语法 

这种语法允许你直接使用变量名作为对象的属性名,并且如果该变量名与属性名相同,则可以省略冒号和值。

let data = {  
    name: 'milk',  
    address: 'thailand'  
}  
const vm = new Vue({  
    el: '#root',  
    data: data  
})

这是传统的 JavaScript 对象字面量写法,其中 data: data 明确地将变量 data 的值赋给了对象属性 data

但是,使用 ES6 的属性名简写语法,你可以直接写成:

const vm = new Vue({  
    el: '#root',  
    data  
})

这里,data 变量被用作对象的属性名,并且由于属性名和变量名相同,所以 JavaScript 解释器会自动将 data 变量的值赋给该属性。这种写法更为简洁,并且在变量名和属性名一致时很常见。

注意:属性名简写语法只能在变量名和属性名相同时使用,并且不能用于函数或计算属性。因为这些属性在对象字面量中需要显式地定义其值和类型(函数或计算属性)。

 

1、函数属性

如果你有一个方法(函数),你不能直接使用属性名简写语法。你需要显式地写出属性名和函数体:

// 错误的简写方式(会导致语法错误)  
const vm = new Vue({  
    el: '#root',  
    methods: myMethod // 错误!应该是一个对象,且包含属性名和方法体  
});  
  
// 正确的写法  
const vm = new Vue({  
    el: '#root',  
    methods: {  
        myMethod() {  
            // 方法体  
        }  
    }  
});

2、计算属性

类似地,计算属性也需要显式地写出属性名和计算逻辑:

// 错误的简写方式(会导致语法错误)  
const vm = new Vue({  
    el: '#root',  
    computed: myComputedProperty // 错误!应该是一个对象,且包含属性名和计算逻辑  
});  
  
// 正确的写法  
const vm = new Vue({  
    el: '#root',  
    computed: {  
        myComputedProperty() {  
            // 计算逻辑  
            return someValue;  
        }  
    }  
});

3、小结

属性名简写语法仅适用于那些属性名和变量名完全相同的场景,并且该变量是一个简单值(如数字、字符串、布尔值、对象或数组,但对象或数组内的属性或元素需要显式定义)。

对于函数、计算属性或其他需要特殊处理的属性,你需要使用传统的 属性名: 值 语法来定义它们。 

5-2、证明setter

vm将data属性,放置在_data属性中。

vm身上,以及Vue的原型所有的属性和方法,在模版里面都能直接用!

这两条线的数据代理,实现的方法:Object.defineProperty。

5-3、小结

数据劫持的目的:

只要修改vue中data中的name,那个页面中用到name的地方,都会修改。为了实现此功能,要让vue检测到data中的name发生了改变。——数据劫持 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1799318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2048小游戏的菜鸡实现方法

# 2048小游戏的实现与分析 2048是一款非常受欢迎的数字滑块游戏,其目标是通过滑动和合并相同数字的方块来创建一个值为2048的方块。下面,我们将通过分析一个C语言实现的2048小游戏的源代码,来探索如何用编程实现这款游戏。 ## 游戏概述 20…

Day12:rem 布局 和 less 使用

目标:使用 rem 和 less 完成移动端的布局。 一、移动 Web 基础 1、谷歌模拟器 在网页右键点“检查”或快捷键 F12,然后右边栏顶部第二个按钮切换设备为移动端,刷新网页,可以看到谷歌模拟器,可以切换模拟器型号、尺寸…

Vue3_上传文件_下载文件

目录 一、上传文件 二、下载文件 vue3对接后端进行文件上传和下载。 一、上传文件 点击上传资料按钮,选择文件,进行上传。 创建一个proFile.vue,文件,这个文件可以作为一个子组件在其他页面引用。 组件用的element-Plus的ElM…

端午假期来临,来使用闪侠惠递便宜寄快递吧!

相信很多人和我一样,每当需要寄快递时,总是感到十分头疼。不同的快递公司有不同的价格、时效和服务质量等等,选择起来真的很不容易。但是现在有了闪侠惠递来帮大家寄快递吧,这个问题就可以迎刃而解了!小编奉劝大家快来…

NSSCTF CRYPTO MISC题解(一)

陇剑杯 2021刷题记录_[陇剑杯 2021]签到-CSDN博客 [陇剑杯 2021]签到 下载附件压缩包,解压后得到 后缀为.pcpang,为流量包,流量分析,使用wireshark打开 {NSSCTF} [陇剑杯 2021]签到 详解-CSDN博客 选择统计里面的协议分级 发现流…

JVMの堆、栈内存存储

1、JVM栈的数据存储 通过前面的学习,我们知道,将源代码编译成字节码文件后,JVM会对其中的字节码指令解释执行,在解释执行的过程中,又利用到了栈区的操作数栈和局部变量表两部分。 而局部变量表又分为一个个的槽位&…

接口的应用、 适配器设计模式

接口的应用 适配器设计模式 Inter package com.itheima.a09;public interface Inter {public abstract void show1();public abstract void show2();public abstract void show3();public abstract void show4();}InterAdapter package com.itheima.a09; //抽象 public abs…

WPF中读取Excel文件的内容

演示效果 实现方案 1.首先导入需要的Dll(这部分可能需要你自己搜一下) Epplus.dll Excel.dll ICSharpCode.SharpZipLib.dll 2.在你的解决方案的的依赖项->添加引用->浏览->选择1中的这几个Dll点击确定。(添加依赖) 3.然后看代码内容 附上源码 using Excel; usi…

苍穹外卖笔记-08-套餐管理-增加,删除,修改,查询和起售停售套餐

套餐管理 1 任务2 新增套餐2.1 需求分析和设计接口设计setmeal和setmeal_dish表设计 2.2 代码开发2.2.1 根据分类id查询菜品DishControllerDishServiceDishServiceImplDishMapperDishMapper.xml 2.2.2 新增套餐接口SetmealControllerSetmealServiceSetmealServiceImplSetmealMa…

阿里通义千问,彻底爆了!(本地部署+实测)

点击“终码一生”,关注,置顶公众号 每日技术干货,第一时间送达! 问大家一个问题:你是否想过在自己的电脑上部署一套大模型?并用自己的知识库训练他? 阿里通义千问今天发布了最新的开源大模型系…

【转】ES, 广告索引

思考: 1)直接把别名切换到上一个版本索引 --解决问题 2)广告层级索引如何解决? -routing、join 3)查询的过程:query and fetch, 优化掉fetch 4)segment合并策略 5)全量写入时副…

二轴机器人大米装箱机:技术创新引领智能包装新潮流

在科技日新月异的今天,自动化和智能化已成为各行各业追求高效、精准生产的关键。作为粮食加工行业的重要一环,大米装箱机的技术创新与应用价值日益凸显。其中,二轴机器人大米装箱机以其高效、稳定、智能的特点,成为市场的新宠。星…

IT学习笔记--Flink

概况: Flink 是 Apache 基金会旗下的一个开源大数据处理框架。目前,Flink 已经成为各大公司大数据实时处理的发力重点,特别是国内以阿里为代表的一众互联网大厂都在全力投入,为 Flink 社区贡献了大量源码。 Apache Flink 是一个…

SQL进阶day10————多表查询

目录 1嵌套子查询 1.1月均完成试卷数不小于3的用户爱作答的类别 1.2月均完成试卷数不小于3的用户爱作答的类别 ​编辑1.3 作答试卷得分大于过80的人的用户等级分布 2合并查询 2.1每个题目和每份试卷被作答的人数和次数 2.2分别满足两个活动的人 3连接查询 3.1满足条件…

嵌入式Linux系统编程 — 2.1 标准I/O库简介

目录 1 标准I/O库简介 1.1 标准I/O库简介 1.2 标准 I/O 和文件 I/O 的区别 2 FILE 指针 3 标准I/O库的主要函数简介 4 标准输入、标准输出和标准错误 4.1 标准输入、标准输出和标准错误概念 4.2 示例程序 5 打开文件fopen() 5.1 fopen()函数简介 5.2 新建文件的权限…

分享:各种原理测厚仪的发展历程!

板材厚度的检测离不开测厚仪的应用,目前激光测厚仪、射线测厚仪、超声波测厚仪等都已被广泛的应用于板材生产线中,那你了解他们各自的发展历程吗? 激光测厚仪的发展: 激光测厚仪是随着激光技术和CCD(电荷耦合器件&…

如何挑选最适合你的渲染工具

随着技术的发展,云渲染平台逐渐成为设计师、动画师、影视制作人员等创意工作者的得力助手。然而,市场上的云渲染平台种类繁多,如何选择最适合自己的渲染工具成为了一个需要认真考虑的问题。 在挑选适合自己的云渲染工具时,我们需…

tomcat10部署踩坑记录-公网IP和服务器系统IP搞混

1. 服务器基本条件 使用的阿里云服务器,镜像系统是Ubuntu16.04java version “17.0.11” 2024-04-16 LTS装的是tomcat10.1.24阿里云服务器安全组放行了:8080端口 服务器防火墙关闭: 监听情况和下图一样: tomcat正常启动&#xff…

Vue2(0基础入门)

环境准备 安装脚手架 vuecli: npm install -g vue/clivite: npm init vuelatest-g 全局安装,任意目录都可以使用vue脚本 进入目录创建项目: 在目录的终端输入:vue ui安装devtool(这个网页是安装好了自动跳转的) 运行项目: …

MS1112驱动开发

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…