mvvm的初步思想
1.Object.defineProperty(obj,key,desc);
用法:1.给对象新增属性和特性
2.修改对象属性值和特性
desc(属性特性):
1.enumerable:boolean 可枚举
2.writable :boolean 可写
3.value:any 赋值
4.get 取值
5.set 改值
2.思路:
对象的赋值和改值其实是通过Object.defineProperty的get和set特性来实现的,一般默认模式。
通过改写属性的get和set的特性,来实现对一个对象的监听。
3.举例:
- var obj = {age:23};
- console.log(obj.age); //23
- Object.defineProperty(obj,'age',{
- get(){
- return 24;
- }
- });
- console.log(obj.age); //24
- obj.age = 25;
- console.log(obj.age); //24
原理:对象属性和赋值取值都会触发自身的get和set特性。
4.实现:
- /*js 监听器*/
- var transi = "";
- function observe(obj,key){
- if(obj[key] && (typeof obj[key] == 'object')){
- Object.keys(obj[key]).forEach((v,index)=>{
- observe(obj[key],v,obj[key][v]);
- });
- } else {
- Object.defineProperty(obj,key,{
- set(newV){
- transi = newV;
- console.log('值改变');
- },
- get(){
- console.log('新值为' + transi);
- return transi;
- }
- })
- }
- }
- var obj = {name : 'wang',age:{max:12,good:{at:30}}};
- observe(window,'obj');
- obj.age.good.at = 44;
- console.log(obj.age.good.at);
5.延伸:
vue的双向绑定机制:当改变一个值时,在这个值的set特性中触发其他值的改变,实现数据实时更新的机制。
6.核心:
1.observer观察者: 观察一个对象,当某一属性改变时,触发set特性,由set触发与之关联的属性,哪些与之关联,怎么建立起关系?需要一个订阅者,即为一个数组,存放一些关联的对象。
2.watcher订阅者: 订阅者需要自己的更新机制,在set中被触发时需要及时更新自己的数据,再渲染到页面上,需要complier来解析页面,实现view层改变。
3.complier解析: 通过js获取指令模板,正则匹配换值,将操作封装放进set函数中实现view层自动更新。
7.数组的push、shift、concat、unshift、pop等api触发数据更新重新渲染:
数组没法像对象可以对字段的监听,若想实现监听,必然需要重写push、shift、concat、unshift、pop这些函数
方案一:
- const push1 = Array.prototype.push;
- Array.prototype.push = function () {
- render(); //拦截进行数组render重新渲染
- return push1.apply(this,arguments);
- };
此方案虽然实现数组的监听,但也改变了所有数组的原型,而且不是所有数组都需要监听;
方案二:
- 中心思想:代理原型
- var obj = Object.create(Array.prototype);
var prototypePush = Array.prototype.push;
obj.push=function () {
- render(); //拦截进行数组render重新渲染
- return prototypePush.apply(this,arguments);
};
var arr = [];
arr.__proto__ = obj;
mvvm的初步思想的更多相关文章
- JDBC 常用词汇以及初步思想
####JDBC程序访问数据库步骤
- 对MVVM思想的在认识
如果说MVP是对MVC的进一步改进,那么MVVM则是思想的完全变革.它是将“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,通过ViewModel进行交互,而且Model ...
- 从angularJS看MVVM
javascript厚积薄发走势异常迅猛,导致现在各种MV*框架百家争雄,MVVM从MVC演变而来,为javascript注入了全新的活力.我工作的业务不会涉及到angularJS[ng]这么重量级的 ...
- 【iOS】小项目框架设计(ReactiveCocoa+MVVM+AFNetworking+FMDB)
上一个项目使用到了ReactiveCocoa+MVVM+AFNetworking+FMDB框架设计,从最初的尝试,到后来不断思考和学习,现在对这样一个整体设计还是有了一定了理解与心得.在此与大家分享下 ...
- 浅谈MVC、MVP、MVVM架构模式的区别和联系
MVC.MVP.MVVM这些模式是为了解决开发过程中的实际问题而提出来的,目前作为主流的几种架构模式而被广泛使用. 一.MVC(Model-View-Controller) MVC是比较直观的架构模式 ...
- 完全掌握KMP算法思想
文档下载页面http://download.csdn.net/detail/yedeqixian/4209500 80页在讲KMP算法的开始先举了个例子,让我们对KMP的基本思想有了最初的认 ...
- angularJS看MVVM
从angularJS看MVVM javascript厚积薄发走势异常迅猛,导致现在各种MV*框架百家争雄,MVVM从MVC演变而来,为javascript注入了全新的活力.我工作的业务不会涉及到a ...
- js架构设计模式——从angularJS看MVVM
javascript厚积薄发走势异常迅猛,导致现在各种MV*框架百家争雄,MVVM从MVC演变而来,为javascript注入了全新的活力.我工作的业务不会涉及到 angularJS[ng] 这么重量 ...
- Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 2)
MVVM回顾 经过上一篇文章的介绍,相信你对 MVVM的设计思想有所了解.MVVM的核心思想就是解耦,View与ViewModel应该感受不到彼此的存在.View只关心怎样渲染,而ViewModel只 ...
随机推荐
- CentOS7.6中mysql实践
cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 使用:yum -y install mysql mysql-server 安装 ...
- VM安装后没有桥链接协议解决方法
从昨天到今天各种折腾的.网络就是各种不通,能使用的手段都上了,还是不行.奇怪的连DNS都ping不通. ping DNS时一致报: Destination Host Unreachable ... ...
- 【编程之美】用C语言实现状态机(实用)
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/lihuidashen/p/115105 ...
- Go语言标准库之fmt
fmt标准库是我们在学习Go语言过程中接触最早最频繁的一个了,本文介绍了fmtb包的一些常用函数. fmt fmt包实现了类似C语言printf和scanf的格式化I/O.主要分为向外输出内容和获取输 ...
- 微服务SpringCloud之服务网关zuul一
前面学习了Eureka.Feign.Hystrix.Config,本篇来学习下API网关zuul.在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服 ...
- ImageView的功能和使用
ImageView继承自View类,它的功能用于显示图片, 或者显示Drawable对象 xml属性: src和background区别 参考:http://hi.baidu.com/sunboy_2 ...
- 编译gaia
./rkst/mkimage.sh rk3066-eng -j8 gaia 分别是编译文件路径 编译的输出类型 处理器分配数 待编译模块 //flash gaia1. adb remount2. ad ...
- Android mmap 文件映射到内存介绍
本文链接: Android mmap 文件映射到内存介绍 Android开发中,我们可能需要记录一些文件.例如记录log文件.如果使用流来写文件,频繁操作文件io可能会引起性能问题. 为了降低写文件的 ...
- 01:***VideoToolbox硬编码H.264
最近接触了一些视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会提供GPU ...
- Android进程的优先级说明
引言 Android系统尽可能长时间地保持应用程序进程,但为了新建或者运行更加重要的进程,总是需要清除一些进程来回收内存.为了决定保留或终止哪个进程,根据进程内运行的组件及这些组件的状态,系统把每个进 ...