关于__defineGetter__ 和__defineSetter__的说明


Posted in Javascript onMay 12, 2007

作者:anbutu
来源:http://anbutu.javaeye.com/blog/post/194276
关键字: JavaScript   Mozilla __defineGetter__ __defineSetter__

Getter是一种获取一个属性的值的方法,Setter是一种设置一个属性的值的方法。可以为任何预定义的核心对象或用户自定义对象定义getter和setter方法,从而为现有的对象添加新的属性。
有两种方法来定义Getter或Setter方法:

在对象初始化时定义 
在对象定义后通过Object的__defineGetter__、__defineSetter__方法来追加定义 
在使用对象初始化过程来定义Getter和Setter方法时唯一要做的事情就是在getter方法前面加上“get”,在setter方法前面加上“set”。
还有一点要注意的就是getter方法没有参数,setter方法必须有一个参数,也就是要设置的属性的新值。
例如:

o = {     
    value:9,     
    get b() {return this.value;},     
    set setter(x) {this.value = x;}     
}    

在对象定义后给对象添加getter或setter方法要通过两个特殊的方法__defineGetter__和__defineSetter__。这两个函数要求第一个是getter或setter的名称,以string给出,第二个参数是作为getter或setter的函数。
例如我们给Date对象添加一个year属性:
Date.prototype.__defineGetter__('year', function() {return this.getFullYear();});     
Date.prototype.__defineSetter__('year', function(y) {this.setFullYear(y)});     var now = new Date;     
alert(now.year);     
now.year = 2006;     
alert(now);    

至于采用哪种形式主要取决于个人的编程风格,采用第一种形式结构紧凑,更容易理解。但是假如你想在对象定义以后再添加Getter或Setter,或者这个对象的原型不是你写的或是内置对象,那么只好采用第二种方式了。
下面是一个为Mozilla浏览器添加innerText属性的实现:
HTMLElement.prototype.__defineGetter__      
(     
   "innerText",function()     
   //define a getter method to get the value of innerText,      
   //so you can read it now!      
   {     
      var textRange = this.ownerDocument.createRange();     
      //Using range to retrieve the content of the object     
      textRange.selectNodeContents(this);     
      //only get the content of the object node     
      return textRange.toString();     
      // give innerText the value of the node content     
   }     
); 
Javascript 相关文章推荐
javascript 硬盘序列号+其它硬件信息
Dec 23 Javascript
javascript 获取图片颜色
Apr 05 Javascript
jquery indexOf使用方法
Aug 19 Javascript
javascript写的异步加载js文件函数(支持数组传参)
Jun 07 Javascript
Spring mvc 接收json对象
Dec 10 Javascript
JS中常用的输出方式(五种)
Jun 12 Javascript
Angular多选、全选、批量选择操作实例代码
Mar 10 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
Aug 30 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
Nov 27 jQuery
世界上最短的数字判断js代码
Sep 09 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
May 09 Javascript
jquery实现鼠标悬浮弹出气泡提示框
Dec 23 jQuery
JavaScript Archive Network 集合
May 12 #Javascript
(仅IE下有效)关于checkbox 三态
May 12 #Javascript
弹出广告特效代码(一个IP只弹出一次)
May 11 #Javascript
模拟用户操作Input元素,不会触发相应事件
May 11 #Javascript
网上抓的一个特效
May 11 #Javascript
用javascript实现分割提取页面所需内容
May 09 #Javascript
javascript语句中的CDATA标签的意义
May 09 #Javascript
You might like
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
2012/01/15 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
JQueryMiniUI按照时间进行查询的实现方法
2017/06/07 jQuery
Javascript实现跨域后台设置拦截的方法详解
2017/08/04 Javascript
vue实现商城上货组件简易版
2017/11/27 Javascript
pygame加载中文名mp3文件出现error
2017/03/31 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
python+jinja2实现接口数据批量生成工具
2019/08/28 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
python用opencv完成图像分割并进行目标物的提取
2020/05/25 Python
Python错误的处理方法
2020/06/23 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
比利时香水网上商店:NOTINO
2018/03/28 全球购物
会计专业推荐信
2013/10/29 职场文书
单位未婚证明范本
2014/01/18 职场文书
倡议书格式
2014/04/14 职场文书
小学生安全教育广播稿
2014/10/20 职场文书
初二学生评语大全
2014/12/26 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android