Javascript监视变量变化的方法


Posted in Javascript onJune 09, 2015

本文实例讲述了Javascript监视变量变化的方法。分享给大家供大家参考。具体分析如下:

大家应该知道,在C#中对于属性、文件等的更改监视非常简单,因为有委托(事件)、FileSystemWatcher等好东东扶持。

那么在JavaScript中,如何对变量的更改进行监视呢?首先,我仿照c#的属性来对JS进行操作,写出了如下的示例:

function Class1()
{
  var oldValue='';
  var name='xu';
  var id='1';
  this.setName=function(n)
  {
   oldValue=name;
   name=n;
   this.propertyChange('name',oldValue,n);
 }
 this.setID=function(n)
 {
   oldValue=id;
   id=n;
   this.propertyChange('id',oldValue,n);
 }
 this.display=function()
 {
   alert(name+'\'s id is :'+id);
 }
}
Class1.prototype={
 propertyChange:function(propertyName,oldValue,newValue)
 {
   alert(propertyName+'\'s value changed from '+oldValue+' to '+newValue); 
 }
};
var c=new Class1();
c.setName('xu22');
c.setID('5');
c.display();

将对对象内部变量(私有变量)的赋值操作提取到了方法中,而在该方法中触发相应的变量值更改回调方法。

按说这样搞就能监视变量 的更改了,但是在FireFox的官方网站上有一个叫Object.watch(unwatch)的东东,可以用来监视变量的变更。

非常可惜的是,这个方法在IE等浏览器下不能正常运行。俺到网上搜了一番,在

http://stackoverflow.com/questions/1269633/javascript-watch-for-object-properties-changes

中找到如下东东:

if (!Object.prototype.watch)
{
   Object.prototype.watch = function (prop, handler) 
   {
     var oldval = this[prop], newval = oldval,
     getter = function ()
     {
       return newval;
     },
     setter = function (val) 
     {
       oldval = newval;
       return newval = handler.call(this, prop, oldval, val);
     };
     if (delete this[prop])
     { 
       if (Object.defineProperty) // ECMAScript 5
       {      
         Object.defineProperty(this, prop, {get: getter,set: setter});
       }
       else if (Object.prototype.__defineGetter__ && Object.prototype.__defineSetter__) 
       {
         Object.prototype.__defineGetter__.call(this, prop, getter);
         Object.prototype.__defineSetter__.call(this, prop, setter);
       }
     }
   };
}
if (!Object.prototype.unwatch)
{
   Object.prototype.unwatch = function (prop) 
   {
     var val = this[prop];
     delete this[prop]; 
     this[prop] = val;
   };
}

通过__defineSetter__来对赋值操作监听~~~

OK,好东西。收藏一下。

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
你的编程语言可以这样做吗?
Sep 07 Javascript
javascript:以前写的xmlhttp池,代码
May 18 Javascript
window.onload 加载完毕的问题及解决方案(上)
Jul 09 Javascript
讨论javascript(一)工厂方式 js面象对象的定义方法
Dec 15 Javascript
jquery 如何动态添加、删除class样式方法介绍
Nov 07 Javascript
深入理解Javascript动态方法调用与参数修改的问题
Dec 10 Javascript
react-native之ART绘图方法详解
Aug 08 Javascript
一个基于react的图片裁剪组件示例
Apr 18 Javascript
vue mint-ui tabbar变组件使用
May 04 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
Sep 27 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
May 20 Javascript
详解vue修改elementUI的分页组件视图没更新问题
Nov 13 Javascript
简介JavaScript中的unshift()方法的使用
Jun 09 #Javascript
JavaScript中的splice()方法使用详解
Jun 09 #Javascript
JavaScript实现Iterator模式实例分析
Jun 09 #Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
Jun 09 #Javascript
JavaScript数组迭代器实例分析
Jun 09 #Javascript
在Javascript中处理数组之toSource()方法的使用
Jun 09 #Javascript
JavaScript中的some()方法使用详解
Jun 09 #Javascript
You might like
虚拟主机中对PHP的特殊设置
2006/10/09 PHP
第二节--PHP5 的对象模型
2006/11/16 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
jquery 查找新建元素代码
2010/07/06 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
Javascript玩转继承(一)
2014/05/08 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
python通过移动端访问查看电脑界面
2020/01/06 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
python speech模块的使用方法
2020/09/09 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
AJAX的全称是什么
2012/11/06 面试题
2014年党支部承诺书
2014/05/30 职场文书
MySQL注入基础练习
2021/05/30 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
2021/10/15 MySQL