监听 javascript 对象的变化

这一章话题的由来,还要从一些学员的作业说起。写这篇文章主要是想让大家能从不同的角度分析问题,学习的过程中多看,多练,多想,多查,多用心。在特别多的学习网站中大部分的学习资料基本都是循规蹈矩的,例如慕课网的 javascript 入门教程中,很多讲师都讲了一些实例,而这些例子中的代码风格如出一辙,没什么新意,而且这些教程占了很大一部分比例。在这里,给大家提供另外一种思路 ------ 监听,具体代码的实现大家自己实现。也欢迎大家评论区写出不同想法。

先给出监听的概念:监听一个对象的某个属性是否发生变化,在该属性变化时立即触发制定的回调函数。

实例:购物车,想必大家肯定都接触过,那它的功能如何去实现呢?

以某宝购物车截图为例:

一、功能概述

  1. 选中商品 -- 总数,总价发生变化
  2. 增加单类商品数量 -- 总数, 总价,单类商品总价 发生变化
  3. 删除 单类商品 -- 总数总价发生变化

二、数据模型

单个商品数据模型{ischeck:是否选中, single:12, count, 2, total:24}

总商品数据模型{items:商品列表, totalCount:总数, totalPrice:总价}

三、常用逻辑

1. 点击复选框(选中单类商品),修改总数 和 总价

代码格式如下:


var singleItem = document.getElementById("复选框");

singleItem.点击事件 = function(){}

    if(this选中){

总数=总数+this.count;

总价=总价+this.total;

  } else {

总数=总数-this.count;

总价=总价-this.total;

}

}

四、监听模式

监听模式的另一个表达方式是观察者模式,其实并没有什么高级的。购物车这个功能用监听模式可以描述为:当修改什么的时候,什么发生变化。

watch(item, ‘isCheck‘,
  function(newVal, oldVal, obj){
     if(newVal){
       all[‘totalCount‘] = all[‘totalCount‘] + obj[‘count‘];
       all[‘totalPrice‘] = all[‘totalPrice‘] + obj[‘total‘];
     } else {
       ...
     }
});
item[‘isCheck‘] = false;

  

功能其实是一样的,只不过是从“当修改什么的时候,去修改另外的什么”这种思想转变为了“当修改什么的时候,什么发生变化”。

五、相关资料

1. Object.prototype.watch()

网址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/watch

例1:

var o = {p:1};o.watch("p",function (id,oldval,newval) { console.log("o."+id+"由"+oldval+" 变为 "+newval); return newval;  });o.p = 2;o.p = 3;

上面的代码显示结果如下:

o.p 由 1 变为 2 o.p 由 2 变为 3

警告:这个方法是非标准的,仅在Gecko中实现了,并且这方法主要是为了在调试的时候使用。

2. github上也有一些watch.js的项目,

推荐一个:https://github.com/melanke/Watch.JS

具体使用情况和对它的评价网上有不少,大家可以看一下。

3. 自己实现

上面代码中的watch方法其实是我自己手写的,粗陋代码如下:

function watch(obj, prop, callback){  if(prop in obj){    var old = obj[prop];    Object.defineProperty(obj,prop, {      enumerable: true,      configurable: true,      set: function(val) {        var o=old;old=val;        callback(val,o,obj);      },      get:function(){        return old;      }    });  } else {    throw new Error("no such property: " + pro);  }}
时间: 2024-10-07 19:31:49

监听 javascript 对象的变化的相关文章

javascript --- 实时监听输入框值的变化

实时监听文本框值变化是非常常见的功能,通常最简单的办法就是用keyup,keydown来实现,但是这种方法有两个问题,一个是当直接复制粘贴的时候没法监听到事件,另外一个问题是在移动端,使用删除键删除输入时候也无法监听到! 解决办法: 1.使用onchange事件 onchange事件是文本框内容改变并失去焦点的时候才触发. 2.比较完美的解决办法:oninput和onproper oninput 是 HTML5 的标准事件,对于检测 textarea, input:text, input:pas

js 实时监听input中值变化

js 实时监听input中值变化 分类: Javascript2014-05-11 11:13 849人阅读 评论(0) 收藏 举报 [html] view plaincopyprint? <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>RunJS

关于如何更好的监听元素属性的变化(转)

我们都知道,jQuery有一个onchange的事件来判断类似input或者textarea标签值变化的事件. jQuery中是通过比如keyup,blur,click等事件来监听值的变化,如果变化就触发change事件. jQuery.event.special.change = { filters: { focusout: testChange, beforedeactivate: testChange, click: function( e ) { var elem = e.target,

android 监听网络状态的变化及实战

android 监听网络状态的变化及实际应用 转载请注明博客地址:http://blog.csdn.net/gdutxiaoxu/article/details/53008266 平时我们在请求错误的情况下,通常会进行处理一下,一般来说,主要分为两方面的错误 - 没有网络的错误 - 在有网络的情况下,我们客户端的错误或者服务器端的错误 今天这篇博客主要阐述以下问题 怎样监听网络状态的变化,包括是否打开WiFi,否打开数据网络,当前连接的网络是否可用 网络没有打开情况下的处理,如弹出对话框,跳转到

关于实时监听输入框的值变化

实时监听文本框值变化是非常常见的功能,通常最简单的办法就是用keyup,keydown来实现,但是这种方法有两个问题,一个是当直接复制粘贴的时候没法监听到事件,另外一个问题是在移动端,使用删除键删除输入时候也无法监听到! 解决办法: 1.使用onchange事件 onchange事件是文本框内容改变并失去焦点的时候才触发. 2.比较完美的解决办法:oninput和onproper oninput 是 HTML5 的标准事件,对于检测 textarea, input:text, input:pas

Android_通过ContentObserver监听短信数据变化

1.简介 在小米等一些机型,无法接收系统发出的短信广播.只能通过观察者ContentObserver,去监听短信数据的变化 2.SMS数据介绍 content://sms/inbox        收件箱 content://sms/sent        已发送 content://sms/draft        草稿 content://sms/outbox        发件箱 content://sms/failed        发送失败 content://sms/queued  

监听器[用于监听ServletRequest对象的产生和销毁] 学习笔记

import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; //监听器[用于监听ServletRequest对象的产生和销毁] public class MyServletRequestListener implements ServletRequestListener { //产生 public void requestInitialized(ServletRequestEvent

js监听某个元素高度变化来改变父级iframe的高度

最近需要做一个iframe调用其他页面内容,这个iframe地址是可变化的,但是里面的内容高度不确定且里面内容高度可调整,所以需要通过监听iframe里面body的高度变化来调整iframe的高度. 后面发现了一个好用的插件detect-element-resize.js,首先看一下这个插件的介绍: 插件简介 跨浏览器,基于事件,元素调整大小检测. 简而言之,此实现不使用内部计时器来检测大小更改(就像我发现的大多数实现一样).它使用scroll大多数浏览器上的onresize事件,以及IE10及

oninput和onpropertychange实时监听输入框值的变化

传统监听输入框的做法就是使用keyup.keydown.keypress,或者change事件来实现,但keyup.keydown.keypress事件是只要完成击键事件后就触发,不考虑输入框的值是否变化,也监听不了使用鼠标右键[剪贴]和[粘贴]这些操作,更监听不了使用JS动态改变值的变化.而change事件必须是焦点离开输入框后才触发,并不能实时监听.所以这几个事件来监听输入框值变化并不完美.ie浏览器(ie6-8)可以直接使用onpropertychange事件来实时监听(包括JS动态改变值