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 绑定事件时传递参数的实现方法
Oct 13 Javascript
根据表格中的某一列进行排序的javascript代码
Nov 29 Javascript
jQuery移除元素自动解绑事件实现思路及代码
May 31 Javascript
js实现圆盘记速表
Aug 03 Javascript
javascript设计模式之单体模式学习笔记
Feb 15 Javascript
angular2 ng build部署后base文件路径问题详细解答
Jul 15 Javascript
基于Vue2.X的路由和钩子函数详解
Feb 09 Javascript
jQuery中可见性过滤器简单用法示例
Mar 31 jQuery
基于jQuery.i18n实现web前端的国际化
May 04 jQuery
vue实现pdf文档在线预览功能
Nov 26 Javascript
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
详解JS数组方法
Nov 20 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/10/09 PHP
php学习之数据类型之间的转换介绍
2011/06/09 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
2011/11/03 PHP
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
php实现微信公众号无限群发
2015/10/11 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
Prototype Object对象 学习
2009/07/12 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
jQuery使用post方法提交数据实例
2015/03/25 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
[56:18]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
Python使用wxPython实现计算器
2018/01/30 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
Python使用folium excel绘制point
2019/01/03 Python
python tkinter组件摆放方式详解
2019/09/16 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
班级出游活动计划书
2014/08/15 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
SQL之各种join小结详细讲解
2021/08/04 MySQL