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 相关文章推荐
XHTML下,JS浮动代码失效的问题
Nov 12 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
Nov 24 Javascript
jQuery获得内容和属性示例代码
Jan 16 Javascript
js变量、作用域及内存详解
Sep 23 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
May 16 Javascript
javascript表达式和运算符详解
Feb 07 Javascript
easyui-datagrid特殊字符不能显示的处理方法
Apr 12 Javascript
jQuery实现购物车的总价计算和总价传值功能
Nov 28 jQuery
微信小程序swiper禁止用户手动滑动代码实例
Aug 23 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
Sep 10 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
Mar 19 Javascript
Angular8 简单表单验证的实现示例
Jun 03 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中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
PHP与jquery实时显示网站在线人数实例详解
2016/12/02 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
python一键升级所有pip package的方法
2017/01/16 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
Canvas实现保存图片到本地的示例代码
2018/06/28 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
八年级英语教学反思
2014/01/09 职场文书
教育学习自我评价
2014/02/03 职场文书
优秀部门获奖感言
2014/02/14 职场文书
年度考核自我鉴定
2014/03/19 职场文书
元旦联欢会主持词
2014/03/26 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
陕西导游词
2015/02/04 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python
keepalived + nginx 实现高可用方案
2022/12/24 Servers