javascript中依赖属性(Dependency Property)的实现
好久没在首页发点东西了,昨天在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)的实现相关推荐
- 深入理解JavaScript中的属性和特性
深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...
- WPF 中依赖属性的继承(Inherits)
WPF中依赖属性的值是是可以设置为可继承(Inherits)的,这种模式下,父节点的依赖属性会将其值传递给子节点.例如,数据绑定中经常使用的DataContextProperty: var host ...
- JavaScript中的属性:如何遍历属性
JavaScript中的属性:如何遍历属性 在JavaScript中,遍历一个对象的属性往往没有在其他语言中遍历一个哈希(有些语言称为字典)的键那么简单.这主要有两个方面的原因:一个是,JavaScr ...
- [转] JavaScript中的属性:如何遍历属性
在JavaScript中,遍历一个对象的属性往往没有在其他语言中遍历一个哈希(有些语言称为字典)的键那么简单.这主要有两个方面的原因:一个是,JavaScript中的对象通常都处在某个原型链中,它会从 ...
- 详解 javascript中offsetleft属性的用法(转)
详解 javascript中offsetleft属性的用法 转载 2015-11-11 投稿:mrr 我要评论 本章节通过代码实例介绍一下offsetleft属性的用法,需要的朋友可以做一 ...
- JavaScript中的属性操作
为什么80%的码农都做不了架构师?>>> JavaScript中的属性操作 一. 原型链 在js中,任何一个对象都有一个prototype属性,在js中记做:_proto_. ...
- [译]JavaScript中的属性:定义和赋值的区别
原文:http://www.2ality.com/2012/08/property-definition-assignment.html 你知道吗?定义一个属性和为一个属性赋值是有区别的.本文解释了两 ...
- 理解 Kotlin 中的属性(property)
这篇文章是一时兴起想写的,因为我发现我对Kotlin的属性理解一直有误 Java 中的属性是什么(property) 首先我们要搞清楚在 Java 中属性是什么,在 Java 中类的属性不是指一个字段 ...
- 【Cson原创】javascript中length属性的探索
本文中,我将会通过类数组对象(array like object),探索javascript中的length属性的一些秘密. 例子1: var obj={0:'a',1:'b'}alert(obj.l ...
最新文章
- 这一年,信息技术领域上演的“断舍离”
- 查看计算机用户创建时间,敬业签在电脑端怎样查看团签内容的创建时间?
- 深入了解EJB (一) EJB在java世界的地位
- log4j中配置日志文件相对路径方法
- 延长汽车寿命的6个良好习惯
- 个人信息保护呼吁“基本法”
- 【kafka】kafka 数据重复的一个 案例
- manacher算法--最长回文子串
- MongoDB数据库操作和程序基础文档
- js篇1-数组基础方法
- IE下载xlsx、docx、pptx文件时自动变成zip文件问题
- 全国ps计算机考试时间,全国计算机考试一级PS考试大纲
- WIFI系列协议--802.11ax--wifi6--高效率无线标准简称HE--11Gbit
- CentOS-scp系统间文件传输
- 单击即可提高游戏速度:什么是可调整大小的BAR?
- teamviewer LAN 设置代理
- 分布式服务框架HSF学习 Dubbo VS HSF
- 华师大 OJ 3024
- 论文笔记 |【AAAI2022】SCSNet
- 黑马程序员C++职工管理系统
热门文章
- 远程服务器任务,远程大批量操作windows服务器的计划任务
- 自动部署 php,Jenkins实现PHP的自动部署
- java 进程不关闭_java运行程序关不了窗口
- python gevent模块 下载_Python中的多任务,并行,并发,多线程,多进程,协程区别...
- 放图片 java_java怎么在我想要的图片上在放一个我想要的图片
- ftp完成版本更新php,php – 将开发团队从FTP转换为版本控制系统
- python网页结构分析_Python爬虫基础之网页组成解析
- springcloud config服务端配置(二)
- 分享一篇关于陌生人社交的竞品分析报告
- 这才是真正的用户增长