自己动手实现MVVM

1、数据劫持(vue):通过Object.defineProperty()去劫持数据每个属性对应的getter和setter
2、脏值检测(angular):通过特定事件比如input,change,xhr请求等进行脏值检测。
3、发布-订阅模式(backbone):通过发布消息,订阅消息进行数据和视图的绑定监听。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

<script>
// var a = ['1','2','3','4','5'];
//// var c = {'wyq':1,'ldx':2};
// var b = Object.keys(a).forEach(key => {
// console.log(key+"//"+a[key]);
// });
// console.log(b);
function observe(data) {
//Object.keys(如果传值是数组返回一个数组,如果是对象返回一个数组索引值是key值);
if (!data || typeof data !== 'object') {
return;
}
// Object.keys(data).forEach(key => {
// observeProperty(data, key, data[key])
// })
return new Observer(data);
}
function observeProperty(obj, key, val) {
observe(val);
//参数
// object
// 必需。 要在其上添加或修改属性的对象。 这可能是一个本机 JavaScript 对象(即用户定义的对象或内置对象)或 DOM 对象。
// propertyname
// 必需。 一个包含属性名称的字符串。
// descriptor
// 必需。 属性描述符。 它可以针对数据属性或访问器属性。

    Object.defineProperty(obj, key, {
        enumerable: true,   // 可枚举
        configurable: true, // 可重新定义
        get: function () {
            console.log(val);
            return val;
        },
        set: function (newVal) {
            if (val === newVal || (newVal !== newVal && val !== val)) {
                return;
            }
            console.log('数据更新啦 ', val, '=>', newVal);
            val = newVal;
        }
    });
}
var data = {
    a: 'hello'
}
observe(data);

</script>
</body>
</html>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • defineProperty() 学习书籍《ECMAScript 6 入门 》 Proxy Proxy 用于修改某...
    Bui_vlee阅读 671评论 0 1
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,827评论 2 17
  • JS基础讲解 JavaScript组成ECMAScript:解释器、翻译DOM:Document Object M...
    FConfidence阅读 580评论 0 1
  • 如何控制alert中的换行?\n alert(“p\np”); 请编写一个JavaScript函数 parseQu...
    heyunqiang99阅读 1,101评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,908评论 18 139