Vue实现MVVM

本文详细介绍了Vue实现MVVM的过程,通过Object.defineProperty实现数据劫持,利用setter和getter监听数据变化,结合数据驱动和发布-订阅者模式,实现数据与视图的双向绑定。内容涵盖Observer、Dep和Watcher的实现,以及数据绑定的小案例和MVVM设计模式的解析。
摘要由CSDN通过智能技术生成

Vue实现MVVM

js创建对象的两种⽅式

//第⼀种
var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "Software Engineer";
person.sayName = function(){
 alert(this.name);
}
//第⼆种
var person = {
 name: "Nicholas",
 age: 29,
 job: "Software Engineer",
 sayName: function() {
 alert(this.name);
 }
}

属性描述符:

数据属性:数据属性包含⼀个数据值的位置,在这个位置可以读取和写⼊值

1、可配置性 [[Configurable]] : 表示能否通过delete删除属性,能否修改属性特性,能否把数据属性修改为访问器属性。
2、可枚举性[[Enumerable]]:表示能否通过for-in循环返回属性。
3、可写⼊性[[Writable]]:表示能否修改属性值。
4、属性值[[Value]]:表示属性值。

访问器属性:是包含⼀对gettersetter函数

**Object.defineProperty()**⽅法对数据属性和访问器属性进⾏修改

该⽅法接受三个参数:属性所在对象,属性名字和⼀个描述符对象

**Object.getOwnPropertyDescriptor()**⽅法取得指定对象指定属性的描述符

这个⽅法接收两个参数:属性所在对象,属性名字

如果要求对⽤户的输⼊进⾏特殊处理,或者设置属性的依赖关系,

就需要⽤到访问器属性了

Object.defineProperty

ES6中某些方法的实现依赖于它,VUE通过它实现双向绑定

此方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象

语法

Object.defineProperty(object, attribute, descriptor)
这三个参数都是必输项
第一个参数为目标对象
第二个参数为需要定义的属性或者方法
第三个参数为目标属性所拥有的特性

descriptor
value: 属性的值
writable: 属性的值是否可被重写(默认为falseconfigurable: 总开关,是否可配置,若为false, 则其他都为false(默认为falseenumerable: 属性是否可被枚举(默认为falseget: 获取该属性的值时调用
set: 重写该属性的值时调用

简单定义一下

var a= {}
Object.defineProperty(a,"b",{
   value:123
})
console.log(a.b)  //123
a.b = 456
console.log(a.b)  //123
a.c = 110
for (item in a) {
    console.log(item, a[item])    //c 110
}
因为 writable 和 enumerable 默认值为 false, 所以对 a.b 赋值无效,也无法遍历它

configurable

总开关,是否可配置,设置为 false 后,就不能再设置了,否则报错, 例子

var a= {}
Object.defineProperty(a,"b",{
  configurable:false
})
Object.defineProperty(a,"b",{
  configurable:true
})
//error: Uncaught TypeError: Cannot redefine property: b

writable

是否可重写

var a = {}; 
Object.defineProperty(a, "b", { 
    value : 123,
    writable : false 
});
console.log(a.b); // 打印 123
a.b = 25; // 没有错误抛出(在严格模式下会抛出,即使之前已经有相同的值)
console.log(a.b); // 打印 123, 赋值不起作用。

enumerable

属性特性 enumerable 定义了对象的属性是否可以在 for…in 循环和 Object.keys() 中被枚举

var a= {}
Object.defineProperty(a,"b",{
  value:3445,
  enumerable:true
})
console.log(Object.keys(a));// 打印["b"]

enumerable改为false

var a= {}
Object.defineProperty(a,"b",{
  value:3445,
  enumerable:false //注意咯这里改了
})
c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值