关于__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 继承详解(一)
Jul 13 Javascript
jQuery阻止冒泡和HTML默认操作
Nov 17 Javascript
当jQuery1.7遇上focus方法的问题
Jan 26 Javascript
理解JavaScript中worker事件api
Dec 25 Javascript
实例讲解避免javascript冲突的方法
Jan 03 Javascript
关于backbone url请求中参数带有中文存入数据库是乱码的快速解决办法
Jun 13 Javascript
javascript 判断当前浏览器版本并判断ie版本
Feb 17 Javascript
教你如何编写Vue.js的单元测试的方法
Oct 17 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
Oct 31 Javascript
对TypeScript库进行单元测试的方法
Jul 18 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
Apr 11 Javascript
ES6函数实现排它两种写法解析
May 13 Javascript
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
安装apache2.2.22配置php5.4(具体操作步骤)
2013/06/26 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
htm调用JS代码
2007/03/15 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
第六章之辅组类与响应式工具
2016/04/25 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
EasyUI 数据表格datagrid列自适应内容宽度的实现
2019/07/18 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
vue穿梭框实现上下移动
2021/01/29 Vue.js
Python中列表元素转为数字的方法分析
2016/06/14 Python
使用python实现接口的方法
2017/07/07 Python
Python编程实现的图片识别功能示例
2017/08/03 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
解析Python3中的Import
2019/10/13 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
python/golang 删除链表中的元素
2020/09/14 Python
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
大学团支书的自我评价分享
2013/12/14 职场文书
消防宣传口号
2014/06/16 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
财政局个人总结
2015/03/04 职场文书
Redis集群的关闭与重启操作
2021/07/07 Redis
python库sklearn常用操作
2021/08/23 Python
Redis高并发缓存架构性能优化
2022/05/15 Redis
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP