vue的双向绑定是由数据劫持结合发布者-订阅者模式实现的,那么什么是数据劫持?vue是如何进行数据劫持的?说白了就是通过Object.defineProperty()来劫持对象属性的setter和getter操作,在数据变动时做你想要做的事情.我们可以看一下通过控制台梳齿一个定义在vue初始化数据上的对象是什么.

var vm = new Vue({
    data: {
        test : {
            a: 1
        }
    },
    created: function () {
        console.log(this.test);
    }
});

打印结果:

vue双向绑定原理-defineProperty

在打印结果中我们可以看到属性a有两个方法:get和set.为什么会有这两个方法呢,这正是vue通过Object.defineProperty()进行数据劫持的.

Object.defineProperty()这个方法是做什么的呢?文档上是这样说的

vue双向绑定原理-defineProperty

 简单的说,他可以控制一个对象属性的一些特有操作,比如读写权,是否可枚举,这里我们主要研究它的get和set方法,如果想清楚更多用法,可以参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

我们可以很轻松的打印出一个对象的属性数据:

var Book = {
  name: '人性的弱点'
};
console.log(Book.name);  // 人性的弱点

但是如果在执行console.log(Book.name)的同时,给书的书名增加一个书名号呢,这个时候应该怎么做,这时候我们就需要用到Object.defineProperty( )了:

//在console.log(book.name)同时,直接给书加一个书号
var Book = {};
var name = '';
Object.defineProperty(Book,'name',{
    set:function(value) {
        name = value;
        console.log('你取了一个书名叫:'+value);
    },
    get:function() {
        console.log('get方法被监听到');
        return '<'+name+'>';
    }
});
Book.name = '人性的弱点';  //你取了一个书名叫:人性的弱点
console.log(Book.name); //<人性的弱点>

 

通过Object.defineProperty( )这个方法设置了Book对象的name属性,对其get和set方法进行重写操作,get方法在获得name属性时被调用,set方法在设置name属性时被触发.所以在执行Book.name='人性的弱点' 这个语句时调用set方法,输出你取了一个书名叫:人性的弱点.当调用console.log(Book.name)时触发get方法,输出<人性的弱点>。

相关文章:

  • 2021-07-22
  • 2021-12-06
  • 2021-07-28
  • 2021-05-25
  • 2021-06-03
猜你喜欢
  • 2022-12-23
  • 2021-08-20
  • 2021-06-03
  • 2021-08-27
相关资源
相似解决方案