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 相关文章推荐
一个可以显示阴历的JS代码
Mar 05 Javascript
javascritp实现input输入框相关限制用法
Jun 29 Javascript
js中巧用cssText属性批量操作样式
Mar 13 Javascript
$.ajax返回的JSON无法执行success的解决方法
Sep 09 Javascript
jQuery 全选 全部选 反选 实现代码
Aug 17 Javascript
javascript验证内容为数字以及长度为10的简单实例
Aug 20 Javascript
微信小程序 页面跳转传参详解
Oct 28 Javascript
10道典型的JavaScript面试题
Mar 22 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
Aug 31 Javascript
angular6的响应式表单的实现
Oct 10 Javascript
video.js添加自定义组件的方法
Dec 09 Javascript
React如何创建组件
Jun 27 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中的日期及时间
2006/11/23 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
javascript json2 使用方法
2010/03/16 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
详解Vue之事件处理
2020/07/10 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
[52:03]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第三场 1月31日
2021/03/11 DOTA
用Python程序抓取网页的HTML信息的一个小实例
2015/05/02 Python
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
Python装饰器语法糖
2019/01/02 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
python使用opencv在Windows下调用摄像头实现解析
2019/11/26 Python
python绘制封闭多边形教程
2020/02/18 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
浅谈PyTorch中in-place operation的含义
2020/06/27 Python
戴森英国官网:Dyson英国
2019/05/07 全球购物
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
database面试题
2013/03/28 面试题
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
地震捐款简报
2015/07/21 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书