关于__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 相关文章推荐
Extjs学习笔记之三 extjs form更多的表单项
Jan 07 Javascript
使用js 设置url参数
Jul 08 Javascript
AngularJS变量及过滤器Filter用法分析
Nov 22 Javascript
webpack项目调试以及独立打包配置文件的方法
Feb 28 Javascript
react-navigation之动态修改title的内容
Sep 26 Javascript
使用FormData实现上传多个文件
Dec 04 Javascript
关于自定义Egg.js的请求级别日志详解
Dec 12 Javascript
微信小程序request请求封装,验签代码实例
Dec 04 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
Aug 07 Javascript
手机浏览器唤起微信分享(JS)
Oct 11 Javascript
vue watch监控对象的简单方法示例
Jan 07 Vue.js
AngularJS实现多级下拉框
Mar 25 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
浅析memcache启动以及telnet命令详解
2013/06/28 PHP
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
CI框架无限级分类+递归的实现代码
2016/11/01 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
javascript 写类方式之二
2009/07/05 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
JS模板实现方法
2013/04/03 Javascript
js 走马灯简单实例
2013/11/21 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
微信小程序 密码输入(源码下载)
2017/06/27 Javascript
jQuery实现模糊查询的方法分析
2018/05/10 jQuery
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
python实现汉诺塔方法汇总
2016/07/25 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
详解python tkinter模块安装过程
2020/01/06 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
使用HTML5的链接预取功能(link prefetching)给网站提速
2012/12/13 HTML / CSS
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
Farnell德国:电子元器件供应商
2018/07/10 全球购物
最新销售员个人自荐信
2013/09/21 职场文书
事业单位接收函
2014/01/10 职场文书
新教师个人工作总结
2015/02/06 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL
Python实现科学占卜 让视频自动打码
2022/04/09 Python