Vue是前端三大框架之一,也被很多人指责抄袭,说他的两个核心功能,一个数据双向绑定,一个组件化分别抄袭angular的数据双向绑定和react的组件化思想,咱们今天就不谈这种大是大非,当然我也没到达那个能力。就来简单的说说这个数据双向绑定。

  Vue的数据双向绑定和angular的数据绑定的原理完全不一样,Angular是用的数据脏检测,当Model发生变化,会检测所有视图是否绑定了相关数据,再更改视图,其本质就是循环遍历,发现与更改数据相关的视图,然后将其更新,性能上有点差。而Vue使用的发布订阅模式,是点对点的绑定数据,其本质就是我们今天要谈论的这个方法:Object.defineProperty()

  我们先来看看他的用法:通过这个方法为对象设置的属性可以控制他的很多行为,如:

var obj = {}
obj.sex = 'men'
Object.defineProperty(obj,'height',{
enumerable:true, // 是否可枚举,默认为false
// writable:false, // 默认为false,不可写入,即使下面写入了,遍历该对象也遍历不到
// value:'jhon', //默认值
configurable:true, // 是否可删除,默认false。
set:function(val){
console.log("设置值",val)
_height = val
},
get:function(){
console.log("获取值")
return _height
}
})
obj.height = 100
console.log(obj)
console.log(1,obj.height);
console.log(2,obj._height) delete obj._height;
console.log(obj)
for (var k in obj){
console.log(k)
console.log(obj[k]);
}

enumerable控制该属性是否可枚举,默认为false,不可枚举,通过for in遍历该对象可以发现,是不能遍历出enumerable为false的属性的,但是仍然可以通过对象点的方式来访问该属性。

writable控制属性是否可以被赋值,默认为false。尽管通过对象点的方式赋值,也是遍历不出来的。

value设置该变量的默认值,注意,尽管writable为false的时刻,该值也是生效的,因为这个属性只是控制他是否可以被赋值,并不能阻止他有默认值。

configurable控制该变量是否可删除,默认为false,我们可以通过delete关键字来测试下,发现尽管使用delete删除了该变量,for in 还是可以遍历出来,说明是不能删除的,当其值为true则可以。

  既然谈到delete,就小小的普及下关于他的知识:

  1. delete关键字可以用来删除没有使用var声明的变量
  2. delete关键字还可以用来删除对象的属性
  3. delete关键字拥有返回值,表示删除是否成功,但是不可靠!(即对于一些不可以删除的属性,他删除后没有达到效果,但结果依然为true)
set和get方法:这两个方法会在改变量设置值和获取值时自动调用,但是这两个方法不能和writable以及value一起使用,否则会报错。当这两个方法只设置一个时,就是对应着只读或只写属性。
   set方法里面设置一个变量接收将要设置的值时,可以用其他的名字,如:_height,也可以和该变量同名,如height,但是不管怎么,这个变量都不属于该对象,在外面通过对象点的方式是访问不到的,而只能访问到调用Object.defineProperty()方法设置的那个变量,即他的第二个参数。并且在打印该对象的时候,你会发现height属性后面有个(。。。),并没有直接显示该属性,以后碰到这样的,就说明他是设置了set或get方法,如下图

  细心的同学会发现,Vue 的data属性里面的所有属性都同时具有set和get方法,而Vue正式通过这种机制,检测变量的读取,从而实现与他绑定的视图的更新,这种效率毫无疑问比angular是高。
  set和get方法在Vue中的第一次应用:当想定义个属性,而这个属性又得经过一些转换,才是我们要的值,就可以向下面这样去定义。调用的时候就和其他变量一样调用即可,如:this.end_date
get end_date () {
if (this.local_time.length) {
return toEST(this.local_time[1])
} else {
return ''
}
}
  这里关于数据双向绑定的原理就不做进一步深究了,其实是我自己还理解的不够深,想进一步了解的同学,可以参考这篇文章。http://www.cnblogs.com/kidney/p/6052935.html?utm_source=gold_browser_extension

Vue的数据双向绑定和Object.defineProperty()的更多相关文章

  1. 前端数据双向绑定原理:Object.defineProperty()

    Object.definedProperty方法可以在一个对象上直接定义一个新的属性.或修改一个对象已经存在的属性,最终返回这个对象. Object.defineProperty(obj, prop, ...

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

    原生js实现一个简单的vue的数据双向绑定 vue是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时 ...

  3. 【Vue】-- 数据双向绑定的原理 --Object.defineProperty()

    Object.defineProperty()方法被许多现代前端框架(如Vue.js,React.js)用于数据双向绑定的实现,当我们在框架Model层设置data时,框架将会通过Object.def ...

  4. vue中数据双向绑定的实现原理

    vue中最常见的属v-model这个数据双向绑定了,很好奇它是如何实现的呢?尝试着用原生的JS去实现一下. 首先大致学习了解下Object.defineProperty()这个东东吧! * Objec ...

  5. 对象的属性类型 和 VUE的数据双向绑定原理

    如[[Configurable]] 被两对儿中括号 括起来的表示 不可直接访问他们 修改属性类型:使用Object.defineProperty()  //IE9+  和标准浏览器  支持 查看属性的 ...

  6. vue实现数据双向绑定的原理

    一.知识准备Object.defineProperty( )方法可以直接在一个对象上定义一个新属性,或者修改一个已经存在的属性,并返回这个对象.Object.defineProperty(obj,pr ...

  7. 一、vue的数据双向绑定的实现

    响应式系统 一.概述 Vue通过设定对象属性的 setter/getter 方法来监听数据的变化,通过getter进行依赖收集,而每个setter方法就是一个观察者,在数据变更的时候通知订阅者更新视图 ...

  8. Vue的数据双向绑定原理——Object-defineProperty

    一.定义 ①方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. ②vue.js的双向数据绑定就是通过Object.defineProperty方法实现的,俗称属性拦截 ...

  9. 关于简单的数据双向绑定原理,defineProperty 和Proxy演示

    双向绑定,也就是说js中的数据传到页面,页面中的内容到js,实现同步更新,简单的演示可以直接复制下放HTML代码运行. 在这个例子中,我们使用defineProperty ,Object.define ...

随机推荐

  1. Leetcode840.Magic Squares In Grid矩阵中的幻方

    3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等. 给定一个由整数组成的 N × N 矩阵,其中有多少个 3 × 3 的 & ...

  2. hdu 1272 使用set和并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=1272 这道题就是求图是不是连通无环,我觉得其实就是看看图是不是一棵最小生成树. 所以要是图满足条件,就必然有n个 ...

  3. 利用IDEA构建springboot应用-配置文件

    application.properties配置文件(不建议采用这种配置) 配置文件采用:application.yml文件会更简便,要带空格 属性配置与类中取值 添加bean属性配置到一个类里面,采 ...

  4. vue页面内监听路由变化

    beforeRouteEnter (to, from, next) { // 在渲染该组件的对应路由被 confirm 前调用 // 不!能!获取组件实例 `this` // 因为当钩子执行前,组件实 ...

  5. 5G时代-计算机和网络的又一个春天

    预言 5G时代的到来计算机和网络即将再次变成热门,计算机和网络的前途将不可限量,就经济学思想来说一定是最具有经济价值的技术,计算机和网络将蓬勃发展,迅速膨胀,经济价值变得极高.将成为科技和智能生活的最 ...

  6. 2019-2-3-VisualStudio-扩展开发-添加输出窗口

    title author date CreateTime categories VisualStudio 扩展开发 添加输出窗口 lindexi 2019-02-03 11:41:40 +0800 2 ...

  7. Vue.js 第4章 组件与路由

    组件 什么是组件:组件就是一些标签结构的封装,同时为这些结构添加需要的业务逻辑,设置你想要的样式 一个组件中一般可以设置:结构,功能和样式 为什么要使用组件: 使用方便 复用 组件的创建和使用 组件的 ...

  8. jQuery 链

    通过 jQuery,可以把动作/方法链接在一起. Chaining 允许我们在一条语句中运行多个 jQuery 方法(在相同的元素上). jQuery 方法链接 直到现在,我们都是一次写一条 jQue ...

  9. OracleSpatial函数实例

    Oracle Spatial操作geometry方法   Oracle Spatial中SDO_GEOMETRY类型: CREATE TYPE SDO_GEOMETRY AS OBJECT( SDO_ ...

  10. Asp.net MVC中如何获取控制器的名称

    如果在代码中 当前controller.action的获取RouteData.Route.GetRouteData(this.HttpContext).Values["controller& ...