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的初步思想的更多相关文章

  1. JDBC 常用词汇以及初步思想

    ####JDBC程序访问数据库步骤

  2. 对MVVM思想的在认识

    如果说MVP是对MVC的进一步改进,那么MVVM则是思想的完全变革.它是将“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,通过ViewModel进行交互,而且Model ...

  3. 从angularJS看MVVM

    javascript厚积薄发走势异常迅猛,导致现在各种MV*框架百家争雄,MVVM从MVC演变而来,为javascript注入了全新的活力.我工作的业务不会涉及到angularJS[ng]这么重量级的 ...

  4. 【iOS】小项目框架设计(ReactiveCocoa+MVVM+AFNetworking+FMDB)

    上一个项目使用到了ReactiveCocoa+MVVM+AFNetworking+FMDB框架设计,从最初的尝试,到后来不断思考和学习,现在对这样一个整体设计还是有了一定了理解与心得.在此与大家分享下 ...

  5. 浅谈MVC、MVP、MVVM架构模式的区别和联系

    MVC.MVP.MVVM这些模式是为了解决开发过程中的实际问题而提出来的,目前作为主流的几种架构模式而被广泛使用. 一.MVC(Model-View-Controller) MVC是比较直观的架构模式 ...

  6. 完全掌握KMP算法思想

    文档下载页面http://download.csdn.net/detail/yedeqixian/4209500      80页在讲KMP算法的开始先举了个例子,让我们对KMP的基本思想有了最初的认 ...

  7. angularJS看MVVM

    从angularJS看MVVM   javascript厚积薄发走势异常迅猛,导致现在各种MV*框架百家争雄,MVVM从MVC演变而来,为javascript注入了全新的活力.我工作的业务不会涉及到a ...

  8. js架构设计模式——从angularJS看MVVM

    javascript厚积薄发走势异常迅猛,导致现在各种MV*框架百家争雄,MVVM从MVC演变而来,为javascript注入了全新的活力.我工作的业务不会涉及到 angularJS[ng] 这么重量 ...

  9. Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 2)

    MVVM回顾 经过上一篇文章的介绍,相信你对 MVVM的设计思想有所了解.MVVM的核心思想就是解耦,View与ViewModel应该感受不到彼此的存在.View只关心怎样渲染,而ViewModel只 ...

随机推荐

  1. 实验吧CTF练习题---web---登录一下好吗解析

    实验吧web之登陆一下好么   地址:http://www.shiyanbar.com/ctf/1942 flag值:ctf{51d1bf8fb65a8c2406513ee8f52283e7}   解 ...

  2. js操作cookie(创建、读取、删除)方法总结

    js操作cookie,可以通过开源的插件实现,方便快捷,兼容性好,同样也可以自己写: 此文主要介绍两个常用的插件: Js.cookie.js 和 jQuery.cookie.js 0.Js.cooki ...

  3. 【第二十二篇】从客户端中检测到有潜在危险的 Request.Form 值

    提交数据的时候  用js的方法   escape(富文本框的值)    例:escape(UM.getEditor('Content').getContent()); 取值的时候   unescape ...

  4. js 控制导航各个内容区域

    自己导入一个jquery包就可以直接用 <!DOCTYPE html><html> <head> <meta charset="UTF-8" ...

  5. Mysql优化总结(一)

    一,前言 ​ 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. ​ MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司.My ...

  6. 30 (OC)* 数据结构和算法

    在描述算法时通常用o(1), o(n), o(logn), o(nlogn) 来说明时间复杂度 o(1):是最低的时空复杂度,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间 ...

  7. 04.Django基础四之模板系统

    一 语法 模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二 变量 在Django的模板语言中按此语法使用:{ ...

  8. Vue学习之vue属性绑定和双向数据绑定

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 多事之秋-最近在阿里云上遇到的问题:负载均衡失灵、服务器 CPU 100%、被 DDoS 攻击

    昨天 22:00~22:30 左右与 23:30~00:30 左右,有1台服役多年的阿里云负载均衡突然失灵,造成通过这台负载均衡访问博客站点的用户遭遇 502, 503, 504 ,由此给您带来麻烦, ...

  10. Flutter学习笔记(27)--数据共享(InheritedWidget)

    如需转载,请注明出处:Flutter学习笔记(27)--数据共享(InheritedWidget) InheritedWidget是Flutter中非常重要的一个功能型组件,它提供了一种数据在widg ...