好久没在首页发点东西了,昨天在js上依照wpf中依赖属性的思想尝试写了基本的功能.这里拿出来与大家分享

Demo1 注册依赖属性

step1 定义一个函数

function Person() {this.render = function () { }
};

step2 注册依赖属性

第三个参数是属性变更回调

dp.reg(Person, "name", "terry", function (obj) {obj.render();alert(obj.oldValue);alert(obj.newValue);
});

setp3 修改依赖属性值

上面的回调方法触发了,至于具体这个功能用在什么场合,你懂的

dp.setValue(entity, "name", "zhang");

Demo2 注册只读依赖属性

下面的回调方法将会触发

dp.regReadOnly(Person, "sex", "boy", function (obj) {alert(obj.newValue);
});

另外还可以添加一个属性验证回调,如下,因为年龄不可能小于0

dp.reg(Person, "age", 25, function (obj) {
}, function (value) {if (value < 1)return 1;return value;
});

Demo3 读写依赖属性

用setValue和getValue方法

var entity = new Person();dp.getValue(entity, "age")
dp.setValue(entity, "name", "xinghao");

Demo4 默认属性值

在注册依赖属性时就有一个默认的值,可通过下面方法查看和恢复默认值

dp.getDefaultValue(entity, "name");
dp.clearValue(entity, "name");

Demo5 注销依赖属性

dp.unreg("Person", "name");

说明:以上通过依赖属性注册的属性不会存在原有对象中,即注册了Person,但不会影响Person本身对象.那么久是说依赖属性是一个可插拔的功能.如果你还没有过这种属性定义的尝试的话,那么来试一下吧。我将继续完善其功能,并与大家分享(假设你还没有依赖属性的概念,也可以尝尝鲜)

最后奉上完整代码,尚未完善,大家提意见吧

(function (container) {var ORIGINAL_TYPE = "originalType",PREFIX = "dp"//utilityfunction getPropName(obj) {return PREFIX + obj.originalType;}function getFnName(obj) {var fundoc = obj.prototype ? obj.toString() : obj.constructor.toString(),funcName = fundoc.split('(')[0].split(' ')[1];return funcName;}var dpos = [];container.dp = {};function propertyMetadata(propertyName, defaultValue, propertyChangedCallback) {this.PropertyName = propertyName;this.DefaultValue = defaultValue;this.PropertyChangedCallback = propertyChangedCallback;};propertyMetadata.prototype = {PropertyName: "",isReadOnly: false,Value: undefined,DefaultValue: undefined,CoerceValueCallback: undefined,PropertyChangedCallback: function () { }};function dpObject(entity) {this.objectType = entity;this.dmps = {};};dpObject.prototype = {addDmp: function (propertyName, defaultValue, propChanged, coerceValueCallback) {if (this.dmps[propertyName]) return;var dmp = new propertyMetadata(propertyName, defaultValue, propChanged);dmp.CoerceValueCallback = coerceValueCallback;this.dmps[propertyName] = dmp;return dmp;},getDmpCount: function () {return this.dmps.lenth;},getPropValue: function (propertyName,prop) {var dmp = this.dmps[propertyName];return dmp[prop];},getDmp: function (propertyName) {return this.dmps[propertyName];},clearDmp: function (propertyName) {this.dmps[propertyName] = undefined;delete this.dmps[propertyName];},setValue: function (obj, prop, newValue) {var dmp = this.dmps[prop];if (!dmp || dmp.isReadOnly) return;var oldValue = dmp.Value || dmp.DefaultValue;if (dmp.CoerceValueCallback)newValue = dmp.CoerceValueCallback(newValue);if (newValue !== oldValue)dmp.Value = newValue;if (dmp.PropertyChangedCallback) {var changedArgs = { obj: obj, prop: prop, oldValue: oldValue, newValue: newValue }dmp.PropertyChangedCallback(changedArgs);}},getValue: function (prop) {var dmp = this.dmps[prop];return dmp.Value ? dmp.Value : dmp.DefaultValue;},getDefaultValue: function (prop) {var dmp = this.dmps[prop];return dmp.DefaultValue;},clearValue: function (prop) {var dmp = this.dmps[prop];dmp.Value = undefined;}};dp.unReg = function (obj, prop) {var className = getFnName(obj),dpo = dpos[className];dpo.clearDmp(prop);};dp.isReged = function (obj, prop) {var className = getFnName(obj),dpo = dpos[className];if (!prop)return dpo.getDmpCount() > 0;return dpo.getDmp(prop) == undefined;};dp.isReadOnly=function(obj,prop) {var dpo = getDpo(obj);return dpo.getPropValue(prop, "isReadOnly");};dp.reg = function (obj, prop, value, propChanged, coerceValueCallback, isReadOnly) {var className = getFnName(obj),dpo = dpos[className] = dpos[className] || new dpObject(className);dpo.addDmp(prop, value, propChanged, coerceValueCallback);if (isReadOnly) {var dmp = dpo.getDmp(prop);dmp.isReadOnly = true;}};dp.regReadOnly = function (obj, prop, value, propChanged, coerceValueCallback) {dp.reg(obj, prop, value, null, null, true);};function getDpo(obj) {var className = getFnName(obj),dpo = dpos[className];return dpo;};dp.setValue = function (obj, prop, value) {var dpo = getDpo(obj);dpo.setValue(obj, prop, value);};dp.getValue = function (obj, prop) {var dpo = getDpo(obj);return dpo.getValue(prop, value);};dp.getDefaultValue = function (obj, prop) {var dpo = getDpo(obj);return dpo.getDefaultValue(prop);};dp.clearValue = function (obj, prop) {var dpo = getDpo(obj);dpo.clearValue(prop);};})(window);function Person() {this.render = function () { }
};dp.reg(Person, "name", "terry", function (obj) {obj.render();alert(obj.oldValue);alert(obj.newValue);
});dp.setValue(entity, "name", "zhang");dp.reg(Person, "age", 25, function (obj) {
}, function (value) {if (value < 1)return 1;return value;
});dp.regReadOnly(Person, "sex", "boy", function (obj) {alert(obj.newValue);
});dp.setValue(entity, "age", -1);var entity = new Person();dp.getValue(entity, "age")
dp.setValue(entity, "name", "xinghao");
alert(dp.isReged(entity);
alert(dp.getValue(entity, "name"));
dp.getDefaultValue(entity, "name");
dp.clearValue(entity, "name");
alert(dp.getValue(entity, "name"));
dp.unreg("Person", "name");
dp.setValue(entity, "name", "zhang");

javascript中依赖属性(Dependency Property)的实现相关推荐

  1. 深入理解JavaScript中的属性和特性

    深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...

  2. WPF 中依赖属性的继承(Inherits)

    WPF中依赖属性的值是是可以设置为可继承(Inherits)的,这种模式下,父节点的依赖属性会将其值传递给子节点.例如,数据绑定中经常使用的DataContextProperty: var host ...

  3. JavaScript中的属性:如何遍历属性

    JavaScript中的属性:如何遍历属性 在JavaScript中,遍历一个对象的属性往往没有在其他语言中遍历一个哈希(有些语言称为字典)的键那么简单.这主要有两个方面的原因:一个是,JavaScr ...

  4. [转] JavaScript中的属性:如何遍历属性

    在JavaScript中,遍历一个对象的属性往往没有在其他语言中遍历一个哈希(有些语言称为字典)的键那么简单.这主要有两个方面的原因:一个是,JavaScript中的对象通常都处在某个原型链中,它会从 ...

  5. 详解 javascript中offsetleft属性的用法(转)

    详解 javascript中offsetleft属性的用法 转载  2015-11-11   投稿:mrr    我要评论 本章节通过代码实例介绍一下offsetleft属性的用法,需要的朋友可以做一 ...

  6. JavaScript中的属性操作

    为什么80%的码农都做不了架构师?>>>    JavaScript中的属性操作 一. 原型链 在js中,任何一个对象都有一个prototype属性,在js中记做:_proto_. ...

  7. [译]JavaScript中的属性:定义和赋值的区别

    原文:http://www.2ality.com/2012/08/property-definition-assignment.html 你知道吗?定义一个属性和为一个属性赋值是有区别的.本文解释了两 ...

  8. 理解 Kotlin 中的属性(property)

    这篇文章是一时兴起想写的,因为我发现我对Kotlin的属性理解一直有误 Java 中的属性是什么(property) 首先我们要搞清楚在 Java 中属性是什么,在 Java 中类的属性不是指一个字段 ...

  9. 【Cson原创】javascript中length属性的探索

    本文中,我将会通过类数组对象(array like object),探索javascript中的length属性的一些秘密. 例子1: var obj={0:'a',1:'b'}alert(obj.l ...

最新文章

  1. 这一年,信息技术领域上演的“断舍离”
  2. 查看计算机用户创建时间,敬业签在电脑端怎样查看团签内容的创建时间?
  3. 深入了解EJB (一) EJB在java世界的地位
  4. log4j中配置日志文件相对路径方法
  5. 延长汽车寿命的6个良好习惯
  6. 个人信息保护呼吁“基本法”
  7. 【kafka】kafka 数据重复的一个 案例
  8. manacher算法--最长回文子串
  9. MongoDB数据库操作和程序基础文档
  10. js篇1-数组基础方法
  11. IE下载xlsx、docx、pptx文件时自动变成zip文件问题
  12. 全国ps计算机考试时间,全国计算机考试一级PS考试大纲
  13. WIFI系列协议--802.11ax--wifi6--高效率无线标准简称HE--11Gbit
  14. CentOS-scp系统间文件传输
  15. 单击即可提高游戏速度:什么是可调整大小的BAR?
  16. teamviewer LAN 设置代理
  17. 分布式服务框架HSF学习 Dubbo VS HSF
  18. 华师大 OJ 3024
  19. 论文笔记 |【AAAI2022】SCSNet
  20. 黑马程序员C++职工管理系统

热门文章

  1. 远程服务器任务,远程大批量操作windows服务器的计划任务
  2. 自动部署 php,Jenkins实现PHP的自动部署
  3. java 进程不关闭_java运行程序关不了窗口
  4. python gevent模块 下载_Python中的多任务,并行,并发,多线程,多进程,协程区别...
  5. 放图片 java_java怎么在我想要的图片上在放一个我想要的图片
  6. ftp完成版本更新php,php – 将开发团队从FTP转换为版本控制系统
  7. python网页结构分析_Python爬虫基础之网页组成解析
  8. springcloud config服务端配置(二)
  9. 分享一篇关于陌生人社交的竞品分析报告
  10. 这才是真正的用户增长