网络之美 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 相关文章推荐
js同时按下两个方向键
Dec 01 Javascript
判断iframe是否加载完成的完美方法
Jan 07 Javascript
利用JS自动打开页面上链接的实现代码
Sep 25 Javascript
js关闭子窗体刷新父窗体实现方法
Dec 04 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
Apr 01 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
May 18 Javascript
Angular.js中$apply()和$digest()的深入理解
Oct 13 Javascript
ASP.NET jquery ajax传递参数的实例
Nov 02 Javascript
AngularJS 实现购物车全选反选功能
Oct 24 Javascript
微信小程序商品详情页规格属性选择示例代码
Oct 30 Javascript
Vue入门之数据绑定(小结)
Jan 08 Javascript
使用Angular CLI从蓝本生成代码详解
Mar 24 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
用session做客户验证时的注意事项
2006/10/09 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
2021/02/26 PHP
JavaScript的public、private和privileged模式
2009/12/28 Javascript
js调用图片隐藏&显示实现代码
2013/09/13 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
微信小程序实现联动选择器
2019/02/15 Javascript
vue--vuex详解
2019/04/15 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
Python sqlite3事务处理方法实例分析
2017/06/19 Python
同时安装Python2 & Python3 cmd下版本自由选择的方法
2017/12/09 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
python软件都是免费的吗
2020/06/18 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
如何一键升级Python所有包
2020/11/05 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
什么是组件架构
2016/05/15 面试题
会计专业大学生求职信范文
2014/01/28 职场文书
优秀体育委员自荐书
2014/01/31 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
高中化学教学反思
2016/02/22 职场文书