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 相关文章推荐
Grid得到选择行数据的方法总结
Jan 17 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
Jun 13 Javascript
从数据库读取数据后将其输出成html标签的三种方法
Oct 13 Javascript
JS中setTimeout和setInterval的最大延时值详解
Feb 13 Javascript
js实现简单的获取验证码按钮效果
Mar 03 Javascript
不得不看之JavaScript构造函数及new运算符
Aug 21 Javascript
详解Angular4 路由设置相关
Aug 26 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
Sep 01 Javascript
浅谈express.js框架中间件(middleware)
Apr 07 Javascript
JS将时间秒转换成天小时分钟秒的字符串
Jul 10 Javascript
微信小程序实现导航栏和内容上下联动功能代码
Jun 29 Javascript
Vue实现导航栏菜单
Aug 19 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实现ping
2006/10/09 PHP
其他功能
2006/10/09 PHP
php中Ctype函数用法详解
2014/12/09 PHP
php中的动态调用实例分析
2015/01/07 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
javascript void(0)的妙用
2009/10/21 Javascript
Jquery在IE7下无法使用 $.ajax解决方法
2009/11/11 Javascript
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
2015/05/04 Javascript
AngularJS过滤器filter用法分析
2016/12/11 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
Python冒泡排序注意要点实例详解
2016/09/09 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
python实现超市商品销售管理系统
2019/11/22 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
python打开音乐文件的实例方法
2020/07/21 Python
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
《九色鹿》教学反思
2014/02/27 职场文书
毕业生个人自荐书
2015/03/05 职场文书
三八妇女节主持词
2015/07/04 职场文书
MySQL为id选择合适的数据类型
2021/06/07 MySQL
浅谈Python中的正则表达式
2021/06/28 Python
Golang bufio详细讲解
2022/04/21 Golang