vue的原理

观察者模式和订阅-发布者模式。 Vue实例被创建时,会遍历data属性,并通过Object.defineProperty将 这些属性转化为getter/setter,并进行追踪依赖。每当data属性值被修改时,通知watcher 实例,使得跟他相关的组件进行更新。

让我想到Object.defineProperty()在这中间做了哪些事?

Object.defineProperty()是定义或者修改对象的新属性

语法:

Object.defineProperty(obj, prop, descriptor);

参数为:

obj 为目标对象

prop 是定义或修改属性的名字

descriptor 是目标对象属性的特性

返回值为:

原先传递给函数的对象

举个栗子:

  let obj = {
test: "hello world"
}
Object.defineProperty(obj, "test", {
configurable: true | false,
enumerable: true | false,
value: 任意类型的值,
writable: true | false,
get:function(){},
set:function(){}
})

参数解析

configurable是否可修改或者可删除对象属性

默认为false

enumerable是否可枚举

对象有几种方法去遍历对象的属性,包括 for...inObject.keys()

如果 enumerable=false , 那以上的有关遍历的方法均不能用。

value修改或新增之后的值

这个不难理解

writable是否可重写

如果 writable=false ,那么重写的数据无效,还是原先的值。

get在读取属性时调用的函数

访问函数的时候会自动调用这个,返回的值就是value值,默认是undefined

set在设置属性时调用的函数

为函数属性赋新值的时候会自动调用,并且新值作为参数传入。就是这个属性实现了MVVM的双向绑定

深入浅出的Object.defineProperty()的更多相关文章

  1. 深入浅出Object.defineProperty()

    深入浅出Object.defineProperty() 红宝书对应知识点页码:139页 红宝书150页:hasOwnProperty( )方法可以检测一个属性是存在于实例中,还是存在于原型中,给定属性 ...

  2. javascript之Object.defineProperty的奥妙

    直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...

  3. Object.defineproperty实现数据和视图的联动

    Object.defineproperty语法 var o = {}; // 创建一个新对象 // Example of an object property added with definePro ...

  4. Vue 双向数据绑定原理分析 以及 Object.defineproperty语法

    第三方精简版实现 https://github.com/luobotang/simply-vue Object.defineProperty 学习,打开控制台分别输入以下内容调试结果 userInfo ...

  5. Object.defineProperty vs __defineGetter__ vs normal

    Testing in Chrome 31.0.1650.63 32-bit on Windows Server 2008 R2 / 7 64-bit Test Ops/sec Object.defin ...

  6. Object.defineProperty

    属性类型ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征.ECMA-262定义这些特性是为了实现JavaScript引擎用的,因此在Ja ...

  7. Object.defineproperty实现数据和视图的联动 ------是不是就是 Angular 模型和视图的同步的实现方式???

    参考:http://www.cnblogs.com/oceanxing/p/3938443.html https://developer.mozilla.org/zh-CN/docs/Web/Java ...

  8. 20+行代码使用es5 Object.defineProperty 实现简单的watch功能

    /** * 一个简单的demo 帮助理解defineProperty,只对Object类型参数有效 */ $watch=function(myObject,callback){ function in ...

  9. Object.defineProperty()方法的用法详解

    Object.defineProperty()函数是给对象设置属性的. Object.defineProperty(object, propertyname, descriptor); 一共有三个参数 ...

随机推荐

  1. Makefile中的$(addprefix),添加前缀,指定目标生成目录

    先给大家看段Makefile的代码吧: INCLUDE_DIR=usr/java/jdk1..0_25/include \ usr/java/jdk1..0_25/include/linux INCL ...

  2. ES5的 forEach, map 方法的实现

    如果浏览器不支持forEach,map方法, 要我们自己封装一个, 该怎么操作呢? 1. forEach Array.prototype.forEach = function(fn) { if (th ...

  3. Largest Submatrix 3

    Largest Submatrix 3 给出一个\(n\times m\)的网格图,第i行第j列上的格子有数字\(a[i][j]\),显然,你可以从中找到一个子矩阵,保证子矩阵中的数字互不相同,求子矩 ...

  4. date -d 对于时间的控制

    [root@ ~]# date "+%Y"2019[root@ ~]# date "+%Y%m%d"20190826 [root@localhost ~]# d ...

  5. Restrictions----用法

    ----------------------------------------方法说明 --------------------------QBC常用限定方法-------------------- ...

  6. C# 调用c++数据类型对应

    C#调用 非托管C++ dll 传入Stringbuilder.ref string . ref char 等都报错,如mscorlib.dll 异常.其他信息: 尝试读取或写入受保护的内存.这通常指 ...

  7. Linux环境下安装PHP的memced扩展

    先下载libmemcached: wget  https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.t ...

  8. Android Dialog对话框的七种形式的使用

    参考资料:http://www.oschina.net/question/54100_32486 注:代码进行了整理 在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询 ...

  9. 网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用

    基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. ...

  10. jmeter 读写excel插件编写教程系列(1) -开篇

    不知道为什么,jmeter 竟然不提供 读写excel 的Sampler! 但是在我们自动化接口测试过程中,参数化.保存测试数据,用excel 是比较好的解决方案! 接下来一段儿时间,大虫会抽出一些时 ...