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 相关文章推荐
索趣科技的答案
Feb 07 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
Feb 02 Javascript
基于JS实现checkbox全选功能实例代码
Oct 31 Javascript
获取IE浏览器Cookie信息的方法
Jan 23 Javascript
Javascript中引用类型传递的知识点小结
Mar 06 Javascript
基于angular实现三级联动的生日插件
May 12 Javascript
zTree树形插件异步加载方法详解
Jun 14 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
Oct 25 Javascript
vue页面切换到滚动页面显示顶部的实例
Mar 13 Javascript
vue组件中的样式属性scoped实例详解
Oct 30 Javascript
js实现录音上传功能
Nov 22 Javascript
jQuery实现异步上传一个或多个文件
Aug 17 jQuery
关于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
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
Javascript 面向对象 命名空间
2010/05/13 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
2015/03/03 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
浅谈Python爬虫基本套路
2019/03/25 Python
对于Python深浅拷贝的理解
2019/07/29 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
2020/02/26 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
东南亚旅游平台:The Trip Guru
2018/01/01 全球购物
高中语文教学反思
2014/01/16 职场文书
幼儿园母亲节活动方案
2014/03/10 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
群众路线自我剖析及整改措施
2014/11/04 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python