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

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

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

相关文章

数据库存储过程和锁机制

存储过程 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的,存储过程思想上很简单,就是数据库SQL语言层面的代码封装与有重用 …

Flutter开发效率提升1000%,Flutter Quick教程之对Widget进行删除,剪切,粘贴

一,删除操作 1,首先我们选中要删除的Widget。 2,在左边的侧边栏,点击删除按钮,即可完成对组件的删除操作。 二,剪切。剪切是相同的道理,都是先选中,再点击对应的按钮。 1&#xff…

javaWeb4 Maven

Maven-管理和构建java项目的工具 基于POM的概念 1.依赖管理:管理项目依赖的jar包 ,避免版本冲突 2.统一项目结构:比如统一eclipse IDEA等开发工具 3.项目构建:标准跨平台的自动化项目构建方式。有标准构建流程,能快速…

java 原生http服务器 测试JS前端ajax访问实现跨域传post数据

后端 java eclipse 字节流转字符 package Httpv3;import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer;import java.io.IOException; import java.i…

【全开源】JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码

:构建便捷出行新体验 一、引言:探索打车系统小程序源码的重要性 在数字化快速发展的今天,打车系统小程序已成为我们日常生活中不可或缺的一部分。它以其便捷、高效的特点,极大地改变了我们的出行方式。而背后的关键,…

KOL+UGC:解锁品牌内容营销新策略,增强用户参与与互动

在当今数字化时代,品牌与受众之间的互动性和参与感变得至关重要。其中,KOL和UGC(用户生成内容)的结合,为品牌创造了一种全新的内容创作模式。这种模式不仅增强了内容的吸引力,还极大地提升了品牌与受众之间…

win键盘键位映射:欧版键盘->国内布局|是否应该买国外版笔记本?

最近买了个欧版笔记本电脑,键盘是欧版键盘: 键盘上的按钮实体和国内不完全一样键盘按钮上印的字母符号和国内不完全一样 具体差异 如图: shift处欧版是两个按键。可通过键盘键位映射解决。回车Enter、| 、布局不同。非常别扭,…

跨境反向海淘系统:业务流程解析与未来发展展望

随着全球化的深入发展和互联网技术的飞速进步,跨境购物已经成为越来越多消费者日常生活中的一部分。在这个过程中,反向海淘系统以其独特的优势,逐渐崭露头角,成为跨境电商领域的新星。作为一名在跨境反向海淘系统业务中耕耘了10年…

编写程序,提示用户输入以米/秒(m/s)为单位的速度v和以米/秒的平方(m/s)为单位的加速度 a,然后显示最短跑道长度。

(物理:求出跑道长度)假设一个飞机的加速度是a而起飞速度是v,那么可以使用下 面的公式计算出飞机起飞所需的最短跑道长度: 编写程序,提示用户输入以米/秒(m/s)为单位的速度v和以米/秒的平方(m/s)为单 位的加速度 a,然后显示最短跑道长度。下面…

LCM — Least Common Multiple 最小公倍数

因为任何一个数都可以表示为若干个质数幂的乘积。 比如75 3*5*5,即 2^0 * 3^1 * 5^2 * 7^0 ... 那么对于两个数来说,gcd就是他们取每个质数的较小幂的乘积,lcm则相反。显然,这些幂加起来就是他们乘积。 gcd(a,b) * lcm(a,b) a…

CorelDRAW2024发布更新啦!设计师们的得力助手

在数字化的今天,视觉设计已经成为我们生活中不可或缺的一部分。从手机界面到广告海报,从网页布局到包装设计,每一个细节都离不开设计师们的专业与创意。然而,面对日益增长的设计需求和不断提升的审美标准,许多设计师开…

【算法专题--栈】最小栈--高频面试题(图文详解,小白一看就会!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐解题方法--1 ⭐解题方法--2 四、总结 五、共勉 一、前言 最小栈这道题,可以说是--栈专题--,比较经典的一道题,也是在面试中频率较高的一道题目,通常在面试中,面试官可…

OpenAI发布GPT-4思维破解新策略,Ilya亦有贡献!

OpenAI正在研究如何破解GPT-4的思维,并公开了超级对齐团队的工作,Ilya Sutskever也在作者名单中。 论文地址:https://cdn.openai.com/papers/sparse-autoencoders.pdf 代码:https://github.com/openai/sparse_autoencoder 特征可…

【Unity游戏制作】地精寻宝Gnome‘s Well That Ends Well卷轴动作游戏【一】场景搭建

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 专栏交流🧧&…

Redisson分布式锁原理解析

前言 首先Redis执行命令是单线程的,所以可以利用Redis实现分布式锁,而对于Redis单线程的问题,是其线程模型的问题,本篇重点是对目前流行的工具Redisson怎么去实现的分布式锁进行深入理解;开始之前,我们可以…

什么情况下要配置DNS服务

什么是DNS 一、DNS就是域名解析 我们上网的方式通常都由ip地址组成,但是为了有个规范,而且我们也不可能去记住那么多一串Ip数字,首先域名就会比ip好记很多,其次固定性,一旦服务器换了,只要重新绑定域名对…

Mac - Node/Java 配置安装全流程

Mac - Node/Java 配置安装全流程 一. Git 安装二. Java 相关安装2.1 jenv 版本控制工具2.2 JDK1.8 和 JDK21的安装2.3 maven 安装 三. Node 相关安装3.1 nvm 版本控制工具3.2 Node 版本安装 一. Git 安装 1.我们首先安装一下Homebrew,这个工具很有用,能…

LLM的基础模型7:Positional Encoding

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技(Mamba,xLSTM,KAN)则提…

单列集合.java

单列集合 为了存储不同类型的多个对象,Java提供了一些特殊系列的类,这些类可以存储任意类型的对象,并且存储的长度可变,这些类统称为集合。可以简单的理解为一个长度可变,可以存储不同数据类型的动态数组。集合都位于j…

【UML用户指南】-10-对高级结构建模-高级类

目录 1、类目 2、高级类 3、可见性 4、实例范围和静态范围 5、抽象元素、叶子元素和多态性元素 6、多重性 7、属性 8、操作 9、模板类 10、标准元素 1、类目 类目 (classifier)是描述结构特征和行为特征的机制。类目包括类、关联、接口、数据类…