Vue笔记_02(MVVM模型,Object.defineProperty方法)

1)MVVM模型

1.data中的所有属性,最后都出现了vm身上。

2.vm身上所有的属性及Vue原型上所有属性,在Vue模板中可以直接使用。

2)Object.defineProperty方法

将age属性用该方法设置,当修改age属性(Student.age=19)时,但对象中的值仍为原值。

而其余属性修改后,对象中的值同步修改。

       let Student = {
            Sname: 'shao',
            Sno: '916',
            Sex: '男'
        }
        Object.defineProperty(Student, 'age',
            {
                value: 18
            }
        )
        console.log(Student)//打印对象各数据

同时,利用该方法构建的属性不可以被枚举,结果可以看出遍历结果并没有age属性,演示如下:

console.log(Object.keys(Student))//将对象中各元素用数组的方式遍历

同时,利用该方法构建的属性不可以被删除(delete Student.age)。

解决办法是,加入如下枚举,修改和删除的控制并改为true(说明默认为false):

 Object.defineProperty(Student, 'age',
            {
                value: 18,
                enumerable: true,   //可枚举
                writable: true,     //可修改
                configurable: true //可删除
            }
        )

新需求:要求把Student的age用一个变量number读出来。

是否可以这样

let number = 18
        let Student = {
            Sname: 'shao',
            Sno: '916',
            Sex: '男',
            age:number
        }

语句顺序执行,之后number变化和age没有任何关系,需要手动先将number变化,再将Student.age赋值为number才可以。

可以用getter和setter解决:

get() {
        console.log('读取age属性了')
        return number
      },
set(value) {
       console.log('修改了age属性,且值为', value)
       number = value
      }

需要注意的问题:value和get同一个作用,writable和set同一个作用。各自只能取一个,否则会报下列错误:

Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #<Object>
    at Function.defineProperty (<anonymous>)

 今日代码(2022.10.9)

<!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">
    <script type="text/javascript" src=" ../js/vue.js"></script>
    <title>MyFirstVue</title>
</head>

<body>
    <div id="root">
        <h1>我的名字是{{school.name}},我的学号是{{school.Sno}} </h1>
        <a v-bind:href="url">点击进入CSDN</a><br />
        <!--数据绑定-->
        单向数据绑定:<input type="text" v-bind:value="name"><br />
        双向绑定:<input type="text" v-model:value="name"><br />
        <!--简写形式-->
        单向数据绑定:<input type="text" :value="name"><br />
        双向绑定:<input type="text" v-model="name"><br />
    </div>
    <script type="text/javascript">
        const vm = new Vue(
            {
                el: '#root',
                data: {
                    name: 'shao',
                    Sno: '916',
                    school: {
                        name: 'shao',
                        Sno: '916'
                    },
                    url: 'http://www.csdn.net'
                },
            }
        )
        let number = 18
        let Student = {
            Sname: 'shao',
            Sno: '916',
            Sex: '男',
            //age: number
        }
        Object.defineProperty(Student, 'age',
            {
                //value: 18,
                //enumerable: true,
                //writable: true,
                //configurable: true,
                get() {
                    console.log('读取age属性了')
                    return number
                },
                set(value) {
                    console.log('修改了age属性,且值为', value)
                    number = value
                }
            }
        )
        console.log(Student)//打印对象各数据
        console.log(Object.keys(Student))
    </script>
</body>

</html>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值