如[[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层)

 //发布者
class Vue{
constructor(options){
//new Vue时传进来的对象
this.options = options;
//对象下的data
this.$data = options.data;
//根据#el 获取到具体的dom元素
this.$el = document.querySelector(options.el);
//存放订阅者
this._directive={};
this.Observer(this.$data);
this.Compile(this.$el);
} //劫持数据
Observer(data){
for(let key in data){
//_directive[inputText(key)] =[] []这里面存存储 订阅者
// 也就是都哪些dom元素使用inputText变量了
this._directive[key] = [];
//inputText(key)变量数据
let val = data[key];
//获取到订阅inputText(key)dom元素集合
let _obj = this._directive[key];
//defineproperty 核心方法
Object.defineProperty(this.$data,key,{
get:function () {
return val;
},
set:function(newVal){
//判断数据是否改动
if(val!==newVal){
val=newVal;
//便利订阅者 所有订阅者执行更新 也就是Watcher(下的update)
_obj.forEach(function (el) {
el.update();
})
}
}
})
}
} //解析指令
Compile(el){
let nodes = el.children;
for (let i = 0; i<nodes.length;i++){
let node = nodes[i];
//判断当前元素下是否有 子元素
if(node.children.length){
//递归出所有#app下 dom元素
this.Compile(node);
}
//dom元素是否有v-text属性(指令)
if(node.hasAttribute('v-text')){
let attrValue = node.getAttribute('v-text');
//向订阅者容器 添加订阅者
this._directive[attrValue].push(new Watcher(node,this,attrValue,'innerHTML')); }
if(node.hasAttribute('v-model')){
let attrValue = node.getAttribute('v-model');
//向订阅者容器 添加订阅者
this._directive[attrValue].push(new Watcher(node,this,attrValue,'value'));
let _this = this;
node.addEventListener('input',function () {
//vue实例下的data数据 赋值
_this.$data[attrValue] = this.value;
},false)
}
}
}
}
//订阅者
class Watcher{
constructor(el,vm,exp,attr){
//dom元素
this.el = el;
//vue实例对象
this.vm = vm;
//data下的变量名字
this.exp = exp;
//根据指令 怎样操作dom innerHTML等
this.attr =attr;
this.update();//初始化数据
}
update(){
//dom.(innerHTML等) = vue实例下的data[变量名]
this.el[this.attr] = this.vm.$data[this.exp];
}
}
//实例vue
var bb=new Vue({
el:'#app',
data:{
inputText:'树下的老大爷的博客'
}
});

  

对象的属性类型 和 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. CodeForcesGym 100212E Long Dominoes

    Long Dominoes Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on CodeForcesGym. ...

  2. noip模拟赛 无题

    分析:这道题和以前做过的模拟赛题很像:传送门. 对于前30%的数据可以直接暴力求,k=1的数据利用线段树求区间最大值,没有修改操作可以用主席树.100%的数据主席树是肯定用不了的,观察到K非常小,可以 ...

  3. 【区间dp+组合数+数学期望】Expression

    https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/I [题意] 给定n个操作数和n-1个操作符,组成一个数学式子.每次可以选择两个相 ...

  4. 找宝箱 (bfs)

    Problem Description 作为一个强迫症患者,小 Y 在走游戏里的迷宫时一定要把所有的宝箱收集齐才肯罢休.现在给你一个 N *M 的迷宫,里面有障碍.空地和宝箱,小 Y 在某个起始点,每 ...

  5. hdu4696 Answers(循环节+找规律)

    题意: 分析: 容易想到先把T数组按位置和对应权值建一个有向图(类似置换群那种指法) 然后图建完了,如果C[]里面都是2,那显然只能凑出那些偶数,奇数是不能凑出来的 如果C[]有1有2呢? 事实上是可 ...

  6. spring-kafka

    spring-kafka 使用spring-kafka的小伙伴,看过来. 说明 因为spring-kafka封装的比较厉害,可能跟你实际使用起来有很大的差别. 一个简单的消费例子 在spring-bo ...

  7. Session&Cookie 的介绍和使用

    Session介绍与使用 1.Session基本介绍 Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序 ...

  8. 洛谷 P1555 尴尬的数字

    P1555 尴尬的数字 题目背景 Bessie刚刚学会了不同进制数之间的转换,但是她总是犯错误,因为她的两个前蹄不能轻松的握住钢笔. 题目描述 每当Bessie将一个数转换成新的进制时,她总会写错一位 ...

  9. Redis的集群方案之Sentinel(哨兵模式)(待实践)

    哨兵模式是主从切换的一种方案,但是可以借助此方案实现集群,达到高可用. 先收集教程,待实践. 参考: https://redis.io/topics/sentinel(官方文档) http://ife ...

  10. eclipse常用使用指南

    1.eclipse添加new/删除/一个tomcat. 步骤:window->preference->server->runtime environment.remove掉,再重新n ...