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 相关文章推荐
精心挑选的15个jQuery下拉菜单制作教程
Jun 15 Javascript
jQuery在html有效在jsp无效的原因及解决方法
Aug 02 Javascript
jQuery插件StickUp实现网页导航置顶
Apr 12 Javascript
JavaScript构造函数详解
Dec 27 Javascript
BootStrap实用代码片段之一
Mar 22 Javascript
原生js实现tab选项卡切换
Mar 23 Javascript
vue+vux实现移动端文件上传样式
Jul 28 Javascript
利用node实现一个批量重命名文件的函数
Dec 21 Javascript
JS严格模式知识点总结
Feb 27 Javascript
Vue 进阶之路(三)
Apr 18 Javascript
JSONP解决JS跨域问题的实现
May 25 Javascript
js实现全选和全不选
Jul 28 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
php导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
2014/10/30 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
PHP加MySQL消息队列深入理解
2021/02/27 PHP
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
加载 Javascript 最佳实践
2011/10/30 Javascript
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
js快速排序的实现代码
2013/12/08 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
[03:17]DOTA2英雄基础教程 剧毒术士
2013/12/12 DOTA
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
Python复制目录结构脚本代码分享
2015/03/06 Python
Python实现对字符串的加密解密方法示例
2017/04/29 Python
对Python 语音识别框架详解
2018/12/24 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
阿迪达斯加拿大官网:Adidas加拿大
2016/08/25 全球购物
TripAdvisor台湾:全球最大旅游网站
2018/08/26 全球购物
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
高中毕业生自我鉴定范文
2013/09/26 职场文书
办公室文书岗位职责
2013/12/16 职场文书
物流专业求职计划书
2014/01/10 职场文书
运动会广播稿100字
2014/01/11 职场文书
竞选卫生委员演讲稿
2014/04/28 职场文书
基层党支部整改方案
2014/10/25 职场文书
解决Python字典查找报Keyerror的问题
2021/05/26 Python
MySQL中varchar和char类型的区别
2021/11/17 MySQL
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers
修改Nginx配置返回指定content-type的方法
2022/09/23 Servers