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 相关文章推荐
JavaScript的Cookies
Jan 16 Javascript
javascript 遍历验证所有文本框的值
Aug 27 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
Feb 25 Javascript
document.createElement()用法
Mar 13 Javascript
js读取cookie方法总结
Oct 31 Javascript
jquery实现可关闭的倒计时广告特效代码
Sep 02 Javascript
jqGrid表格应用之新增与删除数据附源码下载
Dec 02 Javascript
基于javascript实现窗口抖动效果
Jan 03 Javascript
js实现登录框鼠标拖拽效果
Mar 09 Javascript
AngularJS实现单一页面内设置跳转路由的方法
Jun 28 Javascript
JavaScript函数apply()和call()用法与异同分析
Aug 10 Javascript
使用vue实现一个电子签名组件的示例代码
Jan 06 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
写一个用户在线显示的程序
2006/10/09 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
PHP读取XML值的代码(推荐)
2011/01/01 PHP
深入密码加salt原理的分析
2013/06/06 PHP
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
PHP实现八皇后算法
2019/05/06 PHP
input 高级限制级用法
2009/03/26 Javascript
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
Bootstrap实现默认导航栏效果
2020/09/21 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
2018/09/04 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
js实现菜单跳转效果
2020/12/11 Javascript
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
2019/06/08 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
关于人生的感言
2014/01/17 职场文书
上班打牌检讨书
2014/02/07 职场文书
读群众路线的心得体会
2014/09/03 职场文书
死亡赔偿协议书
2015/01/28 职场文书
表扬信格式模板
2015/05/05 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
2015年社区消防安全工作总结
2015/10/14 职场文书
高一作文之乐趣
2019/11/21 职场文书