JavaScript Accessor实现说明


Posted in Javascript onDecember 06, 2010

第一种算是比较常见了,通过闭包Store Value从而实现accessor,适用于所有浏览器.

function Sandy(val){ 
var value = val; 
this.getValue = function(){ 
return value; 
}; 
this.setValue = function(val){ 
value = val; 
}; 
} 
//usage 
var sandy = new Sandy("test"); 
sandy.value 
// => undefined 
sandy.setValue("test2") 
sandy.getValue

下面是JavaScript权威指南(中文第五版)中P152页使用闭包的一个例子.
function makeProperty(o, name, predicate) { 
var value; //This is property value; //The setter method simply returns the value 
o['get' + name] = function() { return value;}; 
//The getter method stores the value or throws an exception if 
//the predicate rejects the value 
o['set' + name] = function(v) { 
if (predicate && !predicate(v) { 
throw 'set' + name + ': invalid value ' + v; 
} else { 
value = y; 
} 
} 
} 
//The following code demenstrates the makeProperty() method 
var o = {}; // Here is an empty object 
//Add property accessor methods getName and setName 
//Ensure that only string values are allowed 
makeProperty(o, 'Name', function(x) { return typeof x == 'string'; }); 
o.setName('Frank'); 
//Set the property value; 
print(o.getName()); 
//Get the property value 
o.setName(0); //Try to set a value of the wrong type

第二种方法是使用__defineSetter__与__defineGetter__来实现accessor,看下划线就知道它们并非标准,适用于Firefox 2.0+, Safari 3.0+, Google Chrome 1.0+ 和 Opera 9.5+ ,方法使用见MDN.
function Sandy(val){ 
var value = val, 
_watch = function(newVal) { 
console.log('val is Changed to : ' + newVal); 
} this.__defineGetter__("value", function(){ 
return value; 
}); 
this.__defineSetter__("value", function(val){ 
value = val; 
_watch(val); 
}); 
} 
var sandy = new Sandy("test"); 
sandy.value 
// => test 
sandy.value = "test2"; 
// => 'val is Changed to : test2' 
sandy.value 
// => "test2"

 除了__defineG/Setter__外, 你还可以使用'set'、'get'关键字在在原型对象上定义accessor,对于单个对象同样适用, 适用于Firefox 2.0+, Safari 3.0+, Google Chrome 1.0+ 和 Opera 9.5+.
function Sandy(val){ 
this.value = val; 
} Sandy.prototype = { 
get value(){ 
return this._value; 
}, 
set value(val){ 
this._value = val; 
} 
}; 
//Or 
var sandy = { 
'_value' : 'sandy', 
get value() { 

return this._value; 
}, 
set value(val) { 

this._value = val; 
} 
}

最后一种方法,用到了Object的静态方法defineProperty,作用于单个对象,该方法应该属于ES5的范畴了,目前似乎只有Chrome 支持这种方法,其实Ie8也支持,但操作对象仅限于Dom节点(Dom node),见IEBlog,该方法的使用见MDN.
var sandy = {}, rValue; 
Object.defineProperty(sandy, 'value' , 
{ 
'set' : function(val) { 
rValue = val; 
}, 
'get' : function() { 
return rValue; 
}, 
'enumerable' : true, 
'configurable' : true 
} 
) 
//Ie8+ 
Object.defineProperty(document.body, "description", { 
get : function () { 
return this.desc; 
}, 
set : function (val) { 
this.desc = val; 
} 
}); 
document.body.description = "Content container"; 
// document.body.description will now return "Content container"

‘enumerable','configuralbe' 属于ES5规范中的Property Attributes(属性特性),在这里就不做讨论了,有兴趣的Google或者直接去看ES5的文档. ^ ^
Javascript 相关文章推荐
Dom 是什么的详细说明
Oct 25 Javascript
JavaScript中的函数声明和函数表达式区别浅析
Mar 27 Javascript
最实用的jQuery分页插件
Oct 09 Javascript
js实现的简练高效拖拽功能示例
Dec 21 Javascript
js图片轮播插件的封装
Jul 21 Javascript
three.js 入门案例详解
Jan 23 Javascript
详解angular脏检查原理及伪代码实现
Jun 08 Javascript
Vue中props的使用详解
Jun 15 Javascript
koa+mongoose实现简单增删改查接口的示例代码
May 13 Javascript
jQuery内容选择器与表单选择器实例分析
Jun 28 jQuery
Vue常用传值方式、父传子、子传父及非父子实例分析
Feb 24 Javascript
JavaScript实现网页计算器功能
Oct 29 Javascript
关于Javascript模块化和命名空间管理的问题说明
Dec 06 #Javascript
javascript处理table表格的代码
Dec 06 #Javascript
菜鸟javascript基础资料整理3 正则
Dec 06 #Javascript
菜鸟javascript基础资料整理2
Dec 06 #Javascript
菜鸟javascript基础整理1
Dec 06 #Javascript
js 上传图片预览问题
Dec 06 #Javascript
兼容IE和FF的js脚本代码小结(比较常用)
Dec 06 #Javascript
You might like
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
关于JavaScript的with 语句的使用方法
2011/05/09 Javascript
jQuery的Ajax的自动完成功能控件简要说明
2013/02/22 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
Javascript Ajax异步读取RSS文档具体实现
2013/12/12 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
JS验证不重复验证码
2017/02/10 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
python抓取最新博客内容并生成Rss
2015/05/17 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
Django forms组件的使用教程
2018/10/08 Python
Python+PyQT5的子线程更新UI界面的实例
2019/06/14 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
python通过链接抓取网站详解
2019/11/20 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
办公室副主任岗位职责
2013/11/25 职场文书
产品委托授权书范本
2014/09/16 职场文书
白鹤梁导游词
2015/02/06 职场文书
神州牡丹园的导游词
2019/11/20 职场文书
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript