Vue08-数据代理

一、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发生了改变。——数据劫持 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Open AI又出王炸GPT-4,目测一大波人的饭碗要碎了...

前言 在科技的惊涛骇浪中,每一次技术的飞跃都预示着新时代的曙光。近日,Open AI公司再次震撼业界,推出了其最新力作——GPT-4,这款被誉为“王炸”的语言模型,以其前所未有的智能水平和创造力,不仅在技术圈…

使用 tc (Traffic Control)控制网络延时

设置网络延时 1500ms 800ms tc qdisc add dev eth0 root netem delay 1500ms 800msping 测试 ping www.baidu.com取消设置网络延时 sudo tc qdisc del dev eth0 root

秒杀优化+秒杀安全

1.Redis预减库存 1.OrderServiceImpl.java 问题分析 2.具体实现 SeckillController.java 1.实现InitializingBean接口的afterPropertiesSet方法,在bean初始化之后将库存信息加载到Redis /*** 系统初始化,将秒杀商品库存加载到redis中** throws Excepti…

Java使用GDAL来解析KMZ及KML实战

目录 前言 一、在GQIS中浏览数据 1、关于空间参考 2、属性表格 二、GDAL的相关驱动及解析实战 1、GDAL中的KMZ驱动 2、GDAL实际解析 三、数据解析成果 1、KML解析结果 2、KMZ文件入库 四、总结 前言 在前面的博客中讲过纯Java实现Google地图的KMZ和KML文件的解析&…

学习周报:文献阅读+Fluent案例+Fluent相关算法学习

目录 摘要 Abstract 文献阅读:求解正逆运动波问题的物理信息神经网络 文献摘要 讨论|结论 理论基础 KWM(运动波动方程) Hard constraint (硬约束方式) 具有重新分布的搭配点的PINN 具有停止梯度的分数阶方程 …

艾体宝方案 | ntopng监测异常流量并通知到企业微信

你是否曾因网络异常而感到困扰?在数字化时代,网络流量异常可能给企业带来巨大损失。但别担心,我们为您准备了一份详尽的解决方案!想知道如何利用ntopng及时发现异常流量,并通过企业微信等渠道通知你的团队吗&#xff1…

[网鼎杯 2020 青龙组]jocker

运行程序,发现是要我们自己输入 那么肯定是拿到enc慢慢还原 32位,无壳 进来就红一下报错 这里可以看见长度为24 动调一下看看 这里进行了大量的异或 这里是对地址开始的硬编码进行异或,从而达到smc的效果 所以你也可以发现在进行这一步操作之前 encry函数全是报错 你点开…

【Vue】组件的存放目录问题

注意: .vue文件 本质无区别 组件分类 .vue文件分为2类,都是 .vue文件(本质无区别) 页面组件 (配置路由规则时使用的组件)复用组件(多个组件中都使用到的组件) 存放目录 分类开来的…

apifox 生成签名

目录 前言准备编写签名脚本签名说明捋清思路编码获取签名所需的参数生成签名将签名放到合适的位置完整代码 在apifox中配置脚本新增公共脚本引用公共脚本添加环境变量 参考 前言 略 准备 查看apifox提供的最佳实践文章:接口签名如何处理 编写签名脚本 签名说明…

四款优秀的电脑屏幕监控软件|监控电脑屏幕的必备软件

在选择监控电脑屏幕的软件时,我们需要考虑多个因素,包括软件的功能性、易用性、兼容性、安全性以及价格等。以下是几款在市场上广受好评的监控电脑屏幕的软件,它们各自具有独特的特点和优势。 1.安企神软件 安企神软件是一款专业的电脑屏幕监…

【学习笔记】Windows GDI绘图(十三)动画播放ImageAnimator(可调速)

文章目录 前言定义方法CanAnimate 是否可动画显示Animate 动画显示多帧图像UpdateFramesStopAnimate终止动画Image.GetFrameCount 获取动画总帧数Image.GetPropertyItem(0x5100) 获取帧延迟 自定义GIF播放(可调速) 前言 在前一篇文章中用到ImageAnimator获取了GIF动画的一些属…

代码随想录算法训练营第十五天| 110.平衡二叉树、 257. 二叉树的所有路径、404.左叶子之和

110.平衡二叉树 题目链接:110.平衡二叉树 文档讲讲:代码随想录 状态:还可以 思路:计算左右子树的深度差,递归判断左右子树是否符合平衡条件 题解: public boolean isBalanced(TreeNode root) {if (root n…

Turnitin揭露AI写作痕迹,是否会影响论述是重复率?

Turnitin(www.checktoo.com)为学术界提供了便捷的服务,以确保论文的原创性和学术诚信。然而,许多学生和研究人员在使用Turnitin时,常常会想Turnitin查论文AI率和重复率之间的关系。那么,使用Turnitin查重论…

Kafka消费者api编写教程

1.基本属性配置 输入new Properties().var 回车 //创建属性Properties properties new Properties();//连接集群properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"node1:9092,node2:9092");//反序列化properties.put(ConsumerConfig.KEY_DESERIALIZER_CL…

Windows mstsc

windows mstsc 局域网远程计算机192.168.0.113为例,远程控制命令mstsc

odoo10 权限控制用户只允许看到自己的字段

假设一个小区管理员用户&#xff0c;只想看到自己小区的信息。 首先添加一个用户信息选项卡界面&#xff0c;如下图的 用户 > 隶属信息&#xff1a; 我们在自己创建的user模块中&#xff0c;views文件夹下添加base_user.xml <?xml version"1.0" encoding&q…

【Microelectronic Systems】期末速通

PART1 嵌入式系统概述与玩转mbed 1 嵌入式系统&#xff0c;微控制器&#xff0c;与ARM 1.1什么是嵌入式系统&#xff1f; 微处理器不仅仅存在于通用计算机中&#xff0c;也可以安置在一些不需要计算的设备内部&#xff0c;比如洗衣机&#xff0c;摄像机。微处理器常常可以控制…

前端面试题(二)答案版

面试形式&#xff1a;线上面试&#xff08;不露脸&#xff09;&#xff1a;时长40分钟 面试评价&#xff1a;由易到难&#xff0c;由细到全&#xff0c;比较不错 面试官&#xff1a;项目经理 面试官提问&#xff08;面试题&#xff09;&#xff1a; 1、聊聊最近写的这个项目…

VLAN与三层交换机

目录 一、VLAN的概念及优势 1.1 分割广播域 1.2 VLAN的优势 二、VLAN的种类 2.1 静态VLAN (重点&#xff0c;大部分用的是静态&#xff09; 2.2 动态VLAN 2.3 查看VLAN表&#xff08;命令&#xff09; 三、静态VLAN的配置 3.1 VLAN的范围 3.2 配置静态VLAN的步骤 3.…

Go源码--sync库(2)

简介 这边文章主要讲解 Sync.Cond和Sync.Rwmutex Sync.Cond 简介 sync.Cond 经常用来处理 多个协程等待 一个协程通知 这种场景&#xff0c; 主要 是阻塞在某一协程中 等待被另一个协程唤醒 继续执行 这个协程后续的功能。cond经常被用来协调协程对某一资源的访问 ants协程池…