回顾 object.defineProperty() 方法

区别

defineProperty == 给对象定义属性用的

需要传递三个基本参数

  1. 需要定义属性的对象名
  2. 你要定义的属性叫什么名字(比如给person这个实体添加一个age属性)
  3. 配置项(对象类型的参数,里面存放键值对)

<script>
// 创建一个对象,该对象有两个基本属性
var person = {
name:"张三",
sex:"男"
}
// 为person对象添加属性
// 1、给那个对象添加?
// 2、添加的属性名是什么?
// 3、这个属性的基础配置项(对象类型,键值对形式)
Object.defineProperty(person,"age",{
value:18, // 该属性的值是
})
</script>

需求1

  • 对象person,添加一个属性age,有几种方式?
  • 三种
    1. 直接在 person对象当中添加属性;该属性值可以修改

    2. 通过 .属性;对其设置;该属性值可以修改
    3. 通过 Object.finedProperty()进行添加;该属性值不可枚举(不可修改) 默认情况下

不可枚举性

通过 defineProperty添加的属性

如果不设置配置项,那么该属性是不可枚举的;在控制台中可以看到,颜色变浅了

该属性不参与遍历,我们可以测试下

基本配置项

value

最开始配置的

enumerable

Object.defineProperty(person,"age",{
value:18, // 该属性的值是
enumerable:true, // 该配置项控制添加的属性是否参与枚举
})

writable

设置属性是否可以被修改

configurable

控制属性是否可以被删除

没有通过函数添加age属性的person对象

通过函数添加age属性的person对象删除属性

设置配置项删除掉age属性

需求2

  • 准备一个变量 number,值为18
  • person当中有一个age属性,这个属性的value 是 number(不是手写的18)

问题所在

  • 这个变量的值可能会发生改变,如果呢?

  • 修改number,person对象当中的age值并没有发生改变
  • 同理,修改age,number也不会发生改变

这俩好像有点关系,但好像又没有关系,就js代码加载的时候这俩自顶而下有了这一层关系,但也仅仅只有这一层

那怎么完成这个需求呢?

请看下方的高级配置项

高级配置项

get(getter)配置项

解析

  1. 它的数据类型是一个对象
  2. 有人读取 person当中的age属性的时候get就会被调用
  3. 且get的返回值就是age 的 value
  4. 自定义get(getter函数)的时候,不能再使用基础配置了

那 返回一个 waves 字符串吧

三个点儿

  1. invoke:映射
  2. property:属性
  3. getter:get配置项 == 函数
    • get是属性名
    • 他的类型是一个函数类型
    • 加在一起就是getter

  • age 属性 是有的
  • 但是 value 是多少,目前不知道(...)
  • 想知道怎么办?点进去嘛

get函数


写个代码测试一下,打印一句话

看样子是的,我前面的措辞有问题

number与age进行关联

对number值进行修改

那么对age修改呢?

问题所在

  1. 一定是 先访问age
  2. 再调用getter
  3. 当number的value发生改变的时候
  4. 再次访问age,那么就重新调用了getter函数
  5. 重新调用getter,会返回number,而这个number是修改过的,所以这边数据是同步了

修改age;失败

修改number,再访问age;成功

set(setter)配置项

同理,既然有get,那么与之相辅相成的就是set

当你对age属性进行修改的时候,set(setter)函数就被调用

且,调用的时候,会收到具体修改的 值

/**
* 需要传递一个参数value
* 被调用的时候,会收到具体修改的值
*/
set(value){
// 当你对age属性进行修改的时候,set(setter)函数就被调用
// 被调用的时候,会收到具体修改的值
console.log("pseron.age属性发生修改,修改的值是",value);
}

测试

实现双向绑定

  1. get函数

    • 实现了 number 与 age 的绑定,number发生修改的时候,age会发生变化
    • 当 age的值发生变化的时候,number值不变,所以无论怎么修改,age的值 === number
  2. set函数
    • 实现了 age 与 number 的绑定,age的值发生变化的时候,number的值也会跟着变化
    • set函数会接到 age所修改的value,将value 赋值 给 number,完成双向绑定

测试

总结

通过案例

  1. number 与 person,是两个东西
  2. 但是借助 Object.defineProperty,使二者进行了关联
  3. person,确实是一个对象,age确实是person当中的属性
  4. 但是呢?你现用,我现去给你取
    • 靠谁取? == get
    • 靠谁改? == set

7_vue的数据代理,双向绑定的更多相关文章

  1. Vue源码解析---数据的双向绑定

    本文主要抽离Vue源码中数据双向绑定的核心代码,解析Vue是如何实现数据的双向绑定 核心思想是ES5的Object.defineProperty()和发布-订阅模式 整体结构 改造Vue实例中的dat ...

  2. 数据的双向绑定 Angular JS

    接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 ...

  3. React入门---事件与数据的双向绑定-9

    上一节中,我们是从父组件给子组件传送数据,要实现事件与数据的双向绑定,我们来看如何从子组件向父组件传送数据; 接触之前,我们看一些里面函数绑定的知识: 例:通过点击事件改变state的age属性值: ...

  4. 数据的双向绑定 Angular JS之开端篇

    接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 ...

  5. 原生js实现数据的双向绑定

    原生js实现数据的双向绑定 需要了解的属性是原色js的Object.definePrototype(obj,pop,descript); obj:被构造的对象 pop:被构造的对象的属性,创建对象或修 ...

  6. vue中如何实现数据的双向绑定

    vue中如何实现数据的双向绑定 实现视图变化数据跟着变:分两步,上面get中的为第二步(即再次读取的时候会调用get方法得到之前设置的值,以此来实现动态改变) 由于直接写obj.name = this ...

  7. vue2.X props 数据传递 实现组件内数据与组件外的数据的双向绑定

    vue2.0 禁止 子组件修改父组件数据 在Vue2中组件的props的数据流动改为了只能单向流动,即只能由组件外(调用组件方)通过组件的DOM属性attribute传递props给组件内,组件内只能 ...

  8. JavaScript实现数据的双向绑定

    接触到Angulr.js和Vue.js后,提到最多的就是双向绑定 下面将用JavaScript实现数据的双向绑定 <!DOCTYPE html> <html> <head ...

  9. 通过原生js实现数据的双向绑定

    通过js实现数据的双向绑定 : Object.defineProperty了解 语法: Object.defineProperty(obj, prop, descriptor) obj 要定义属性的对 ...

随机推荐

  1. .NET CORE 读书笔记之与.NET Framework对比

    .NET Framework存在的问题 它是属于系统级别安装的程序 操作系统内的所有程序共享一个.NET Framework实例,如果其中某一个应用程序需要升级Framework,其他程序也会收到影响 ...

  2. Dart 异步编程(一):初步认识

    由于 Dart 是单线程编程语言,对于进行网络请求和I/O操作,线程将发生阻塞,严重影响依赖于此任务的下一步操作. 通常,在一个阻塞任务之后还有许许多多的任务等待被执行.下一步任务需要上一步任务的结果 ...

  3. C++ 添加程序图标到我的电脑

    C++ 像我的电脑中 百度网盘的 那图标快捷方式.如何生成的呢?设置程序图标到我的电脑 请看下边代码 就ok了(*^__^*) 嘻嘻-- 类似下图: 大家如果看我下边的不是很清楚,可以下载这个具体工程 ...

  4. 逐层阅读 research paper:Dmitry Berenson 的方法论

    本博客翻译了 这篇文章,包含很实用的 读论文的方法论. 读论文的四个 layers 在读论文之前,要首先搞清楚,自己读论文的目的是什么,或者 希望读到什么程度. 下表列出了常见的读论文目的,以及相应的 ...

  5. wallpaperPKG文件提取

    简单粗暴 下载这个ZIP文件链接: 下载地址戳我 提取码: ag43 解压后双击打开如下文件 我们在解压一下repkg-master.zip解压后如下,注意我的路径进入到这些很多文件的页面 返回首页复 ...

  6. 【manim】学习路径2-构建一些基础的图形,场景

    头文件引入 导入manim命名空间 from manim import * manim基本结构 这是一个最基本的manim结构,格式: from manim import * class 类的名字(S ...

  7. 部署nfs

      NFS可以让服务端跟客户端通过网络共享主机磁盘上的一些数据,主要是在unix和linux系统上实现的一种文件共享方式.   我们可以简单的将NFS看做是一个文件服务器 (file server) ...

  8. format添加未知个参数方法

    一个python巧妙技巧,分享给大家 我的需求是将一个dict的键都format输出,用到了*对字典解包 data = {a: 1, b: 2...} msg = f"{'{} '*len( ...

  9. [第二章 web进阶]XSS闯关-1

    定义:跨站脚本(Cross_Site Scripting,简称为XSS或跨站脚本或跨站脚本攻击)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种.它允许恶意用户将代码注入网页,其他用户浏览网 ...

  10. KingbaseES图形化安装未弹出界面应该如何处理

      关键字: KingbaseES.X Windows.Gnome.DISPLAY 一.Linux下图形安装环境要求 1) 系统首先安装了X Windows的图形化支持软件包. 2) 系统安装了KDE ...