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 iframe的相互操作浅析
Oct 14 Javascript
JavaScript中json对象和string对象之间相互转化
Dec 26 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
Sep 25 Javascript
Javascript中神奇的this
Jan 20 Javascript
js 定义对象数组(结合)多维数组方法
Jul 27 Javascript
jQuery监听浏览器窗口大小的变化实例
Feb 07 Javascript
bootstrap suggest下拉框使用详解
Apr 10 Javascript
JavaScript的继承实现小结
May 07 Javascript
微信小程序 图片宽高自适应详解
May 11 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
Aug 17 jQuery
JavaScript实现简单的文本逐字打印效果示例
Apr 12 Javascript
继承行为在 ES5 与 ES6 中的区别详解
Dec 24 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
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
javascript Select标记中options操作方法集合
2008/10/22 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
简明 Python 基础学习教程
2007/02/08 Python
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Python编写生成验证码的脚本的教程
2015/05/04 Python
Python导入oracle数据的方法
2015/07/10 Python
Python将多份excel表格整理成一份表格
2018/01/03 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
PyCharm代码格式调整方法
2018/05/23 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
python 默认参数相关知识详解
2019/09/18 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
python属于软件吗
2020/06/18 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
全国文明单位申报材料
2014/05/31 职场文书
老龄工作先进事迹
2014/08/15 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
浅谈golang package中init方法的多处定义及运行顺序问题
2021/05/06 Golang
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
关于Numpy之repeat、tile的用法总结
2021/06/02 Python
python神经网络Xception模型
2022/05/06 Python