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 相关文章推荐
Lazy Load 延迟加载图片的jQuery插件中文使用文档
Oct 18 Javascript
使用jquery动态加载javascript以减少服务器压力
Oct 29 Javascript
javascript 函数及作用域总结介绍
Nov 12 Javascript
ECMAScript5(ES5)中bind方法使用小结
May 07 Javascript
js实现登陆遮罩效果的方法
Jul 28 Javascript
基于jQuery实现响应式圆形图片轮播特效
Nov 25 Javascript
JavaScript实现换肤功能
Sep 15 Javascript
JS实现手写parseInt的方法示例
Sep 24 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
Jul 10 Javascript
浅析Vue.js中v-bind v-model的使用和区别
Dec 04 Javascript
js回文数的4种判断方法示例
Jun 04 Javascript
countUp.js实现数字动态变化效果
Oct 17 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
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
情人节之礼 js项链效果
2012/02/13 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
Jquery 实现图片轮换
2015/01/28 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
2020/05/14 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
mac系统安装Python3初体验
2018/01/02 Python
python range()函数取反序遍历sequence的方法
2018/06/25 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
python中实现栈的三种方法
2020/12/19 Python
HTML5+CSS3 诱人的实例:3D立方体旋转动画实例
2016/12/30 HTML / CSS
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
华为慧通面试题
2012/09/11 面试题
学习决心书范文
2014/03/11 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
班主任经验交流材料
2014/12/16 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
防震减灾主题班会
2015/08/14 职场文书
八年级作文之友谊
2019/12/02 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
Python基本知识点总结
2022/04/07 Python