关于__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 相关文章推荐
jQuery1.6 类型判断实现代码
Sep 01 Javascript
jquery提取元素里的纯文本不包含span等里的内容
Sep 30 Javascript
For循环中分号隔开的3部分的执行顺序探讨
May 27 Javascript
DOM基础教程之模型中的模型节点
Jan 19 Javascript
javascript设计模式之对象工厂函数与构造函数详解
Jul 30 Javascript
javascript学习小结之prototype
Dec 03 Javascript
Bootstrap树形组件jqTree的简单封装
Jan 25 Javascript
Javascript json object 与string 相互转换的简单实现
Sep 27 Javascript
JS实现的适合做faq或menu滑动效果示例
Nov 17 Javascript
vue项目中的webpack-dev-sever配置方法
Dec 14 Javascript
用ES6写全屏滚动插件的示例代码
May 02 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
Nov 23 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
PHP实现全角字符转为半角方法汇总
2015/07/09 PHP
如何利用http协议发布博客园博文评论
2015/08/03 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
JS模板实现方法
2013/04/03 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
css配合jquery美化 select
2013/11/29 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
python调用java的jar包方法
2018/12/15 Python
Python3 安装PyQt5及exe打包图文教程
2019/01/08 Python
详解python和matlab的优势与区别
2019/06/28 Python
python实现桌面气泡提示功能
2019/07/29 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
个人生活学习自我评价范文
2013/11/26 职场文书
2019年幼儿园家长接送责任书
2019/10/29 职场文书
python实现简单区块链结构
2021/04/25 Python
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs