首页 > 其他分享 >Vue2入门之超详细教程六-数据代理

Vue2入门之超详细教程六-数据代理

时间:2023-04-14 09:57:53浏览次数:54  
标签:教程 console 之超 age Object person Vue2 defineProperty 属性

1、简介

  这章有点长,希望大家可以耐心看完。在了解数据代理之前需要先了解Object.defineProperty,Object.defineProperty就是给一个对象添加属性用的。数据代理,通过一个对象代理对另一个对象中数据的操作(读/写)。

  Vue中的数据代理:

    通过vm对象来代理data对象中的数下的操作(读/写)

  Vue中数据代理的好处:

    更加方便的操作data中的数据

  基本原理:

    通过Object.defineProperty()把data对象中的所有属性添加到vm上。

    为每一个添加到vm上的属性,都制定一个getter/setter

    在getter/setter内部去操作(读/写)data中对应的属性

  学习Vue之前最后会一些HTML和CSS的基础知识,HTML基础知识 传送门,CSS基础知识 传送门

2、数据代理

1. Object.defineProperty

  在vscode中创一个新目录,叫“05数据代理”,在下面创建一个“1回顾Object.defineProperty方法.html”文件,在里面输入以下代码:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>object.defineproperty方法</title>

</head>

<body>

    <script type="text/javascript">

        let person = {

            name:'张三',

            sex:"男",

            age:18

        }

        console.log(person)

    </script>

</body>

</html>

  使用let定义了一个对象叫person里面有name、sex、age三个属性

 

  不可枚举方式

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>object.defineproperty方法</title>

</head>

<body>

    <script type="text/javascript">

        let person = {

            name:'张三',

            sex:"男",

            // age:18

        }

        Object.defineProperty(person,'age',{

            value:18

        })

        console.log(person)

    </script>

</body>

</html>

  使用Object.defineProperty时传入了一个对象person,并设置了一个属性age,值为18

 

  在代码中加入console.log(Object.keys(person)),可以看出是否可遍历,可以看出只有2个属性

 

  Object.defineProperty的三个配置

  object.defineProperty默认是不可修改、不可枚举、不可被删除的

 

  object.defineProperty有三个配置可以控制修改、枚举和删除

            enumerable:true, // 控制属性是否可以枚举,默认false

            writable:true, // 控制属性是否可以被修改,默认false

            configurable:true //控制属性是否可以被删除

  完整代码:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>object.defineproperty方法</title>

</head>

<body>

    <script type="text/javascript">

        let person = {

            name:'张三',

            sex:"男",

            // age:18

        }

        Object.defineProperty(person,'age',{

            value:18,

            enumerable:true, // 控制属性是否可以枚举,默认false

            writable:true, // 控制属性是否可以被修改,默认false

            configurable:true //控制属性是否可以被删除

        })

        console.log(Object.keys(person))

        console.log(person)

    </script>

</body>

</html>

  get和set方法

  Get方法可以用来读取变量的值:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>object.defineproperty方法</title>

</head>

<body>

    <script type="text/javascript">

        let number = 10

        let person = {

            name:'张三',

            sex:"男",

            // age:18

        }

        Object.defineProperty(person,'age',{

            // value:18,

            // enumerable:true, // 控制属性是否可以枚举,默认false

            // writable:true, // 控制属性是否可以被修改,默认false

            // configurable:true //控制属性是否可以被删除

           

            // 当有人读取person.age属性时,get函数就会被调用,且返回值就是age的值

            get:function(){

                console.log('游人读取age属性了')

                return number

            }

        })

        console.log(Object.keys(person))

        console.log(person)

    </script>

</body>

</html>

  定义了一个number的值为10,通过get和age绑定

 

  Set方法:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>object.defineproperty方法</title>

</head>

<body>

    <script type="text/javascript">

        let number = 10

        let person = {

            name:'张三',

            sex:"男",

            // age:18

        }

        Object.defineProperty(person,'age',{

            // value:18,

            // enumerable:true, // 控制属性是否可以枚举,默认false

            // writable:true, // 控制属性是否可以被修改,默认false

            // configurable:true //控制属性是否可以被删除

           

            // 当有人读取person.age属性时,get函数就会被调用,且返回值就是age的值

            get(){

                console.log('有人读取age属性了')

                return number

            },

            // 当有人修改person的age属性时,set属性(setter)就会被调用,且会收到修改的具体值

            set(value){

                console.log('有人设置age属性')

                number = value

            }

        })

        console.log(Object.keys(person))

        console.log(person)

    </script>

</body>

</html>

  根据结果我们可以看出有了set方法,我就就算不设置writable属性值也是可以被修改的

2. 什么是数据代理

  obj2对象本身没有x属性,通过Object.defineProperty追加一个x属性,值获取另一个对象的

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>

<body>

    <!-- 通过一个对象代理对另一个对象中属性的操作 -->

    <script type="text/javascript">

        let obj = {x:100}

        let obj2 = {y:200}

        Object.defineProperty(obj2,'x',{

            get(){

                return obe.x

            },

            set(value){

                obj.x = value

            }

        })

    </script>

</body>

</html>

3. Vue中的数据代理

  在“05数据代理”目录下,在下面创建一个“3Vue中的数据代理.html”文件,在里面输入以下代码:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

    <script type="text/javascript" src="../js/development/vue.js"></script>

</head>

<body>

    <div id="root">

        <h2>学校名称:{{name}}</h2>

        <h2>学校西地址:{{address}}</h2>

    </div>

</body>

<script type="text/javascript">

    Vue.config.productionTip = false;

    const vm = new Vue({

        el:'#root',

        data:{

            name:"Mr. Li",

            address:"北京朝阳"

        }

    })

</script>

</html>

 

 

 

 

 

  Vue也是通过Object.defineProperty实现的数据关联,在Vue中设置的数下,都会有一个getter一个setter用来设置和获取属性的值

3、小结

  掌握Object.defineProperty中set和get方法

 

4、过程中遇到的错误及解决办法

  该问题时因为get方法中obj写成了obb

 

标签:教程,console,之超,age,Object,person,Vue2,defineProperty,属性
From: https://www.cnblogs.com/lirongyang/p/17233616.html

相关文章

  • 版本管理工具Git:入门教程
    Git使用教程目录Git使用教程1.简介2.安装与配置安装配置3.Git的区域概念4.从远程创建一个新仓库①创建一个远程仓库②把远程仓库取到本地③尝试自己写个提交④再来个提交⑤把提交推送到远程仓库5.本地创建仓库并关联到远程仓库①在项目目录中新建一个仓库②创建一个空白的远程仓......
  • Linux环境tomcat安装步骤详细教程
    下载tomcat包:https://tomcat.apache.org/tomcat-10.1-doc/index.html将下载的安装包放至linux环境的/usr/local/tomcat目录下:执行解压命令tar-xvfapache-tomcat-9.0.73.tar.gz将解压出来的目录改名为tomcat9,然后进入tomcat9/bin目录,执行./startup.sh命令启动tomcat:执行启动命令......
  • 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 10.控制台变量的用法 & 静态函数库 &
    斯坦福课程UE4C++ActionRoguelike游戏实例教程0.绪论概述本文对应Lecture15,61-ConsoleVariablesfordebuggingandgamebalancing。本文将会教你如何在C++中编辑控制台变量的逻辑,通过在游戏中打开控制台,以修改控制台变量的方式来修改游戏里的各种参数;此外,还会使用自......
  • 达观助手AI写作下载安装教程及特色功能详解,速速收藏体验!
    AI时代,你的写作工具需要更新啦!一款全面且免费的AI智能写作插件工具 目前支持Windows系统、WPS软件使用 (Mac、office软件敬请期待) 下载即拥有智能排版、AI润色、AI续写、标题助手、智能纠错、素材搜索等强大助力 最新款的AI写作工具,快来下载体验看看! 下载地址及问题咨询下载地......
  • Mac | iOS | Windows:安装Stable diffusion教程
    热烈欢迎,请直接点击!!!进入博主AppStore主页,下载使用各个作品!!!注:博主将坚持每月上线一个新app!!!Apple已支持的开源库:https://machinelearning.apple.com/research/stable-diffusion-coreml-apple-silicon一、MAC部署安装:https://github.com/apple/ml-stable-diffusiongitclone......
  • 【D02】Bootstrap免费精选模板推荐,附上Django中使用模板教程
    前端模板-AnchorUIKIT前言今天介绍一款制作精良、开源、免费的Bootstrap模板——AnchorUIKIT该模板使用的是Bootstrapv4版本本文将介绍如何在Django中导入该模板的静态资源包并使用介绍官方文档Anchor-afreeBootstrapUIKit(bootcss.com)预览官方文档......
  • 搭建一个安全的Linux服务器教程
    要建立一个安全Linux服务器就首先要了解Linux环境下和网络服务相关的配置文件的含义及如何进行安全的配置。在Linux系统中,TCP/IP网络是通过若干个文本文件进行配置的,也许你需要编辑这些文件来完成联网工作,但是这些配置文件大都可以通过配置命令linuxconf(其中网络部分的配置可以通......
  • win10安装Redis5、配置自启动教程
    前提条件:首先我安装的是压缩包版的Redis5.0.14.1,下载链接为https://github.com/tporadowski/redis/releases安装教程下载软件并解压进入软件目录,修改redis.windows.conf,如下图所示:启动redis,进入windows命令行,cd到安装路径,然后如下图:本地命令行连接redis,使用redis-cli.......
  • centos下安装python3详细教程
    centos7自带有python,版本是python2.7接下来我们手动安装python3,并且配置后可以并存使用。1.首先,你要知道系统现在的python的位置在哪儿:[root@root~]#whereispythonpython:/usr/bin/python2.7/usr/bin/python/usr/lib/python2.7/usr/lib64/python2.7/etc/python/usr......
  • 工作流引擎 Activiti 进阶教程
    一、流程实例什么是流程实例流程实例(ProcessInstance)代表流程定义的执行实例。一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。启动流程实例并添加Businesskey(业务标识)流程定义部署在activiti后,就可以在系统中通过activiti去管理......