网络之美 JavaScript中Get和Set访问器的实现代码


Posted in Javascript onSeptember 19, 2010

标准的Get和Set访问器的实现

function Field(val){ 
this.value = val; 
} 
Field.prototype = { 
get value(){ 
return this._value; 
}, 
set value(val){ 
this._value = val; 
} 
}; 
var field = new Field("test"); 
field.value="test2"; 
//field.value will now return "test2"

在如下浏览器能正常工作:

网络之美 JavaScript中Get和Set访问器的实现代码

我们常用的实现方法可能是这样的:

function Field(val){ 
var value = val; this.getValue = function(){ 
return value; 
}; 
this.setValue = function(val){ 
value = val; 
}; 
} 
var field = new Field("test"); 
field.setValue("test2") 
field.getValue() // return "test2"

在DOM元素上Get和Set访问器的实现
HTMLElement.prototype.__defineGetter__("description", function () { 
return this.desc; 
}); 
HTMLElement.prototype.__defineSetter__("description", function (val) { 
this.desc = val; 
}); 
document.body.description = "Beautiful body"; 
// document.body.description will now return "Beautiful body";

在如下浏览器能正常工作:

网络之美 JavaScript中Get和Set访问器的实现代码

 

通过Object.defineProperty实现访问器

将来ECMAScript标准的扩展对象的方法会通过Object.defineProperty来实现,这也是为什么IE8就是通过这种方法来实现get和set访问器,看来微软还是很有远见的,遗憾的是目前只有IE8+和Chrome 5.0+支持,其它的浏览器都不支持,而且IE8+也只支持DOM元素,不过将来的版本将和Chrome一样支持普通的Javascript对象。
DOM元素上的Get和Set访问器的实现

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"

在如下浏览器能正常工作:

网络之美 JavaScript中Get和Set访问器的实现代码

普通对象的Get和Set访问器的实现
var lost = { 
loc : "Island" 
}; 
Object.defineProperty(lost, "location", { 
get : function () { 
return this.loc; 
}, 
set : function (val) { 
this.loc = val; 
} 
}); 
lost.location = "Another island"; 
// lost.location will now return "Another island"

在如下浏览器能正常工作:

网络之美 JavaScript中Get和Set访问器的实现代码

本文总结

尽管微软的IE只是支持了Object.defineProperty,没有完美的实现Get和Set访问器,但是我们已经看到了IE有了很大的进步,特别是刚发布的IE9使用的新的javascript引擎,支持HTML5和CSS3,支持硬件加速等等,相信有一天各个浏览器都能完全拥抱标准,带来一个完美的WEB世界。

参考文献:

1. Getters and setters with JavaScript
2. JavaScript Getters and Setters

作者:梦想

Javascript 相关文章推荐
JavaScript ECMA-262-3 深入解析.第三章.this
Sep 28 Javascript
jquery $.ajax相关用法分享
Mar 16 Javascript
jquery click([data],fn)使用方法实例介绍
Jul 08 Javascript
js history对象简单实现返回和前进
Oct 30 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
Nov 22 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
Dec 16 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
May 16 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
Sep 01 Javascript
jQuery Mobile 和 Kendo UI 的比较
May 05 Javascript
JS基于正则表达式的替换操作(replace)用法示例
Apr 28 Javascript
vue keep-alive请求数据的方法示例
May 16 Javascript
Vue 引入AMap高德地图的实现代码
Apr 29 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
Sep 19 #Javascript
jquery异步循环获取功能实现代码
Sep 19 #Javascript
JavaScript随机排序(随即出牌)
Sep 17 #Javascript
js下通过getList函数实现分页效果的代码
Sep 17 #Javascript
前端开发的开始---基于面向对象的Ajax类
Sep 17 #Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
Sep 17 #Javascript
js下用eval生成JSON对象
Sep 17 #Javascript
You might like
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
jquery性能优化高级技巧
2015/08/24 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
javascript数据类型详解
2017/02/07 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
vue项目部署到nginx/tomcat服务器的实现
2019/08/26 Javascript
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
Python切片操作实例分析
2018/03/16 Python
利用Python如何生成便签图片详解
2018/07/09 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
pip安装tensorflow的坑的解决
2020/04/19 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
护士毕业生自我鉴定
2014/02/08 职场文书
开学寄语大全
2014/04/08 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书