如[[Configurable]] 被两对儿中括号 括起来的表示 不可直接访问他们

修改属性类型:使用Object.defineProperty()  //IE9+  和标准浏览器  支持

查看属性的数据特性:Object.getOwnPropertyDescriptor()

上图输出的就是

属性类型分为两种:数据属性和访问器属性。

数据属性:有四个

  [[Configurable]]:表示能否通过delete删除属性,能否修改属性特性、能否修改访问器属性 如果修改成false 就不能在修改回来并且再次使用Object.defineProperty()修改属性特性只能修改[[writable]] 默认true

  [[Enumerable]]:表示能否表示目标属性是否可遍历  默认true

for in、Object.keys 和 JSON.stringify()不能返回属性

  [[writable]]:表示能否修改属性值  默认true

  [[value]]:这个位置是属性值,属性值默认undefined 这就是你没有给值时候为什么默认undefined

访问器属性:

  访问器属性:

    [[get]]:获取属性值的时候触发get函数

    [[set]]:设置属性值时触发set函数

    VUE2.0的数据双向绑定就是使用的Object.defineProperty()重写set和get方法实现的,VUE3.0是使用es6中的proxy代理实现的了。

    下面附赠VUE2.0的数据双向绑定原理(简易版因为这里没有虚拟dom层)

  1. //发布者
  2. class Vue{
  3. constructor(options){
  4. //new Vue时传进来的对象
  5. this.options = options;
  6. //对象下的data
  7. this.$data = options.data;
  8. //根据#el 获取到具体的dom元素
  9. this.$el = document.querySelector(options.el);
  10. //存放订阅者
  11. this._directive={};
  12. this.Observer(this.$data);
  13. this.Compile(this.$el);
  14. }
  15.  
  16. //劫持数据
  17. Observer(data){
  18. for(let key in data){
  19. //_directive[inputText(key)] =[] []这里面存存储 订阅者
  20. // 也就是都哪些dom元素使用inputText变量了
  21. this._directive[key] = [];
  22. //inputText(key)变量数据
  23. let val = data[key];
  24. //获取到订阅inputText(key)dom元素集合
  25. let _obj = this._directive[key];
  26. //defineproperty 核心方法
  27. Object.defineProperty(this.$data,key,{
  28. get:function () {
  29. return val;
  30. },
  31. set:function(newVal){
  32. //判断数据是否改动
  33. if(val!==newVal){
  34. val=newVal;
  35. //便利订阅者 所有订阅者执行更新 也就是Watcher(下的update)
  36. _obj.forEach(function (el) {
  37. el.update();
  38. })
  39. }
  40. }
  41. })
  42. }
  43. }
  44.  
  45. //解析指令
  46. Compile(el){
  47. let nodes = el.children;
  48. for (let i = 0; i<nodes.length;i++){
  49. let node = nodes[i];
  50. //判断当前元素下是否有 子元素
  51. if(node.children.length){
  52. //递归出所有#app下 dom元素
  53. this.Compile(node);
  54. }
  55. //dom元素是否有v-text属性(指令)
  56. if(node.hasAttribute('v-text')){
  57. let attrValue = node.getAttribute('v-text');
  58. //向订阅者容器 添加订阅者
  59. this._directive[attrValue].push(new Watcher(node,this,attrValue,'innerHTML'));
  60.  
  61. }
  62. if(node.hasAttribute('v-model')){
  63. let attrValue = node.getAttribute('v-model');
  64. //向订阅者容器 添加订阅者
  65. this._directive[attrValue].push(new Watcher(node,this,attrValue,'value'));
  66. let _this = this;
  67. node.addEventListener('input',function () {
  68. //vue实例下的data数据 赋值
  69. _this.$data[attrValue] = this.value;
  70. },false)
  71. }
  72. }
  73. }
  74. }
  75. //订阅者
  76. class Watcher{
  77. constructor(el,vm,exp,attr){
  78. //dom元素
  79. this.el = el;
  80. //vue实例对象
  81. this.vm = vm;
  82. //data下的变量名字
  83. this.exp = exp;
  84. //根据指令 怎样操作dom innerHTML等
  85. this.attr =attr;
  86. this.update();//初始化数据
  87. }
  88. update(){
  89. //dom.(innerHTML等) = vue实例下的data[变量名]
  90. this.el[this.attr] = this.vm.$data[this.exp];
  91. }
  92. }
  93. //实例vue
  94. var bb=new Vue({
  95. el:'#app',
  96. data:{
  97. inputText:'树下的老大爷的博客'
  98. }
  99. });

  

对象的属性类型 和 VUE的数据双向绑定原理的更多相关文章

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

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

  2. 西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分

    最近我参加了一次来自西安的电话面试(第二轮,技术面),是大厂还是小作坊我在这里按下不表,先来说说这次电面给我留下印象较深的几道面试题,这次先来谈谈Vue的数据双向绑定原理. 情景再现: 当我手机铃声响 ...

  3. vue数据双向绑定原理

    vue的数据双向绑定的小例子: .html <!DOCTYPE html> <html> <head> <meta charset=utf-> < ...

  4. Vue的数据双向绑定和Object.defineProperty()

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

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

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

  6. vuejs数据双向绑定原理(get & set)

    前端的数据双向绑定指的是view(视图)和model(数据)两者之间的关系:view层是页面上展示给用户看的信息,model层一般是指通过http请求从后台返回的数据.view到model的绑定都是通 ...

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

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

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

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

  9. Vue数据双向绑定原理及简单实现

    嘿,Goodgirl and GoodBoy,点进来了就看完点个赞再go. Vue这个框架就不简单介绍了,它最大的特性就是数据的双向绑定以及虚拟dom.核心就是用数据来驱动视图层的改变.先看一段代码. ...

随机推荐

  1. Jupyter notebook使用笔记

    常用快捷键 For a Cell,   Blue -> selecting. Green -> editing. Esc -> exist edit When the cell is ...

  2. Chrome & CORS & Fetch API & Chrome 多开,应用分身

    Chrome & CORS & Fetch API Chrome 浏览器的跨域设置 https://www.cnblogs.com/cshi/p/5660039.html https: ...

  3. POJ 3169_Layout

    大早上水一发=.= 题意: n头牛按编号顺序站成一列,给定n头牛之间的位置关系,求出第n头牛和第一头牛之间的最大距离. 分析: 差分约束系统,这题不等式关系还是挺好找的.注意因为按照顺序排列,所以有d ...

  4. IDUtil 永不重复的ID

    package com.xxx.common.util; import java.util.Random; /** * 各种id生成策略 * * @version 1.0 */ public clas ...

  5. DTRACE简介(1)

    https://blogs.oracle.com/swan/entry/dtrace%E7%AE%80%E4%BB%8B By samwan on 三月 20, 2007 记得几年前看过一部美国大片叫 ...

  6. restful接口就是url嘛,通过http请求发起访问。那接口进行监控,就可以监控这个restful url嘛

    EasyAPI接口管理系统 专注API接口监控,让您的API接口更稳定,与APP更紧密 + 购买监控服务 接口性能分析 分析App对应的API接口请求性能,包含HTTP响应时间.吞吐率.HTTP错误率 ...

  7. 介绍css 的3D 变换(3D transform)

    https://desandro.github.io/3dtransforms/docs/card-flip.html ---------------------------------------- ...

  8. Jenkins安装与使用

    一.Jenkins简介 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作 二.下载与安装 下载地址 ...

  9. 【面试】iOS 开发面试题(一)

      1. #import 跟#include 又什么差别,@class呢, #import<> 跟 #import""又什么差别? 答:#import是Objectiv ...

  10. C++ - 使用copy函数打印容器(container)元素

    使用copy函数打印容器(container)元素 本文地址: http://blog.csdn.net/caroline_wendy C++能够使用copy函数输出容器(container)中的元素 ...