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 相关文章推荐
用jquery实现学校的校历(asp.net+jquery ui 1.72)
Jan 01 Javascript
新浪微博字数统计 textarea字数统计实现代码
Aug 28 Javascript
深入理解JavaScript系列(45):代码复用模式(避免篇)详解
Mar 04 Javascript
js实现Form栏显示全格式时间时钟效果代码
Aug 19 Javascript
javascript实现3D切换焦点图
Oct 16 Javascript
jQuery实现分隔条左右拖动功能
Nov 21 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
Jul 21 Javascript
浅谈Angular中ngModel的$render
Oct 24 Javascript
js学习笔记之事件处理模型
Oct 31 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
Mar 23 jQuery
基于bootstrap实现多个下拉框同时搜索功能
Jul 19 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
Apr 02 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设计模式中的工厂模式
2008/06/12 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
PHP产生不重复随机数的5个方法总结
2014/11/12 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
vue.js路由跳转详解
2017/08/28 Javascript
Koa项目搭建过程详细记录
2018/04/12 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
Python中函数的参数传递与可变长参数介绍
2015/06/30 Python
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
python实现K近邻回归,采用等权重和不等权重的方法
2019/01/23 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
加拿大品牌鞋包连锁店:Little Burgundy
2021/02/28 全球购物
亚洲领先的设计购物网站:Pinkoi
2020/11/26 全球购物
工程现场管理求职自荐信
2013/10/02 职场文书
医院总经理职责
2013/12/26 职场文书
公积金转移接收函
2014/01/11 职场文书
端午节活动策划方案
2014/03/09 职场文书
2014年国庆节寄语
2014/09/19 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
办公用品质量保证书
2015/05/11 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python
react 项目中引入图片的几种方式
2021/06/02 Javascript
进行数据处理的6个 Python 代码块分享
2022/04/06 Python