Vue原了解析:Vue 实例如何实现代理商 data 对象属性的访问
对于初学Vue.js的小伙伴而言,可能会认为Vue实例是一个很神奇的东西!由于它除了帮助我们完成双向绑定之外,还在某些细节方面为我们添加了少量了解上面的小烦恼!希望通过这篇文章能够为勤勉的你解惑~
看一段简单代码先:
new Vue({ el:"#myApp", data:{ userName:"laoWangTou", age:16 }, methods:{ run(){ // 输出结果:laoWangTou今年16岁了 console.log(this.userName+"今年"+this.age+"岁了"); } }, created(){ // this为什么可以调用methods的run方法? this.run(); }})对于以上代码可能会有两个小疑问:
1、为什么钩子函数中的 this.run 可以调用到methods对像下的方法run?
2、为什么methods对象下的run方法可以通过this取得data下的属性?
要弄明白这两个问题首先你要明白下面几个点:
- this即是通过Vue生成的实例vm
const vm = new Vue({ el:"#myApp", created(){ console.log(vm === this);// true }})- $data与data是相等的
const data ={};const vm = new Vue({ el:"#myApp", data, created(){ console.log(this.$data === data);// true }})console.log(vm.$data === data);// true- $data的属性被修改,vm实例下的属性也会发生相应的变化
const vm = new Vue({ el:"#myApp", data:{ userName:"laoWangTou", age:16 }, created(){ this.$data.userName = "xiaoZhang" this.$data.age = 18; // 输出结果:xiaoZhang今年18岁了 console.log(this.userName+"今年"+this.age+"岁了"); }})// 输出结果:xiaoZhang今年18岁了console.log(vm.userName+"今年"+vm.age+"岁了");通过之前的两个疑问及得到的个结论,咱们可以先来个小猜测:
1、通过Vue生成的实例中有一属性为$data,其值为接收对象的data值
2、vm实例中代理商了data的属性
3、methods下的方法赋值给了vm实例
于是,结合Vue.js的源码模拟出了以下较易了解的代码:
// 定义了一个构造函数function Vue(options) { this.$data = options.data || {}; this.initState(options);}Vue.prototype.initState = function (opts) { if(opts.data) this.initData(opts.data); if(opts.methods) this.initMethods(opts.methods); if(opts.created) opts.created.call(this);}Vue.prototype.initData = function (data) { var keys = Object.keys(data); var i = keys.length; while (i--){ const key = keys[i]; this.proxy("$data",key); }}Vue.prototype.initMethods = function (methods) { for (var key in methods) { this[key] = methods[key]; }}Vue.prototype.proxy =function(sourceKey, key) { Object.defineProperty(this, key, { get() { return this[sourceKey][key] }, set(val){ this[sourceKey][key] = val; } });};验证:
const vm = new Vue({ el:"#myApp", data:{ userName:"laoWangTou", age:16 }, methods:{ run(){ // 输出结果:laoWangTou今年16岁了 console.log(this.userName+"今年"+this.age+"岁了"); } }, created(){ // this为什么可以调用methods的run方法? this.run(); }});// 输出结果:laoWangTou今年16岁了console.log(vm.userName+"今年"+vm.age+"岁了");—————END—————
喜欢本文的朋友们,欢迎关注公众号 张培跃,收看更多精彩内容
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Vue原了解析:Vue 实例如何实现代理商 data 对象属性的访问
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Vue原了解析:Vue 实例如何实现代理商 data 对象属性的访问
