JAVASCRIPT  THIS详解 面向对象


Posted in Javascript onMarch 25, 2009

虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的。JavaScript也提供了这个this关键字,不过用起来就比经典OO语言中要"混乱"的多了。
下面就来看看,在JavaScript中各种this的使用方法有什么混乱之处?
1、在HTML元素事件属性中inline方式使用this关键字:
<div onclick="
// 可以在里面使用this
">division element</div>
我们一般比较常用的方法是在此使用:javascirpt: EventHandler(this),这样的形式。不过这里其实可以写任何合法的JavaScript语句,要是高兴在此定义个类也可以(不过将会是个内部类)。这里的原理是脚本引擎生成了一个div实例对象的匿名成员方法,而onclick指向这个方法。
2、用DOM方式在事件处理函数中使用this关键字:
<div id="elmtDiv">division element</div>
<script language="javascript">
var div = document.getElementById('elmtDiv');
div.attachEvent('onclick', EventHandler);
function EventHandler()
{
// 在此使用this
}
</script>
这时的EventHandler()方法中的this关键字,指示的对象是IE的window对象。这是因为EventHandler只是一个普通的函数,对于attachEvent后,脚本引擎对它的调用和div对象本身没有任何的关系。同时你可以再看看EventHandler的caller属性,它是等于null的。如果我们要在这个方法中获得div对象引用,应该使用:this.event.srcElement。
3、用DHTML方式在事件处理函数中使用this关键字:
<div id="elmtDiv">division element</div>
<script language="javascript">
var div = document.getElementById('elmtDiv');
div.onclick = function()
{
// 在此使用this
};
</script>
这里的this关键字指示的内容是div元素对象实例,在脚本中使用DHTML方式直接为div.onclick赋值一个EventHandler的方法,等于为div对象实例添加一个成员方法。这种方式和第一种方法的区别是,第一种方法是使用HTML方式,而这里是DHTML方式,后者脚本解析引擎不会再生成匿名方法。
4、类定义中使用this关键字:
function JSClass()
{
var myName = 'jsclass';
this.m_Name = 'JSClass';
}
JSClass.prototype.ToString = function()
{
alert(myName + ', ' + this.m_Name);
};
var jc = new JSClass();
jc.ToString();
这是JavaScript模拟类定义中对this的使用,这个和其它的OO语言中的情况非常的相识。但是这里要求成员属性和方法必须使用this关键字来引用,运行上面的程序会被告知myName未定义。
5、为脚本引擎内部对象添加原形方法中的this关键字:
Function.prototype.GetName = function()
{
var fnName = this.toString();
fnName = fnName.substr(0, fnName.indexOf('('));
fnName = fnName.replace(/^function/, '');
return fnName.replace(/(^\s+)|(\s+$)/g, '');
}
function foo(){}
alert(foo.GetName());
这里的this指代的是被添加原形的类的实例,和4中类定义有些相似,没有什么太特别的地方。
6、结合2&4,说一个比较迷惑的this关键字使用:
function JSClass()
{
this.m_Text = 'division element';
this.m_Element = document.createElement('DIV');
this.m_Element.innerHTML = this.m_Text;
this.m_Element.attachEvent('onclick', this.ToString);
}
JSClass.prototype.Render = function()
{
document.body.appendChild(this.m_Element);
}
JSClass.prototype.ToString = function()
{
alert(this.m_Text);
};
var jc = new JSClass();
jc.Render();
jc.ToString();
我就说说结果,页面运行后会显示:"division element",确定后点击文字"division element",将会显示:"undefined"。
7、CSS的expression表达式中使用this关键字:
<table width="100" height="100">
<tr>
<td>
<div style="width: expression(this.parentElement.width);
height: expression(this.parentElement.height);">
division element</div>
</td>
</tr>
</table>
这里的this看作和1中的一样就可以了,它也是指代div元素对象实例本身。
8、函数中的内部函数中使用this关键字:
function OuterFoo()
{
this.Name = 'Outer Name';
function InnerFoo()
{
var Name = 'Inner Name';
alert(Name + ', ' + this.Name);
}
return InnerFoo;
}
OuterFoo()();
运行结果显示是:"Inner Name, Outer Name"。按我们在2中的讲解,这里的结果如果是"Inner Name, undefined"似乎更合理些吧?但是正确的结果确实是前者,这是由于JavaScript变量作用域的问题决定的 详细了解推荐参看"原来JScript中的关键字'var'还是有文章的"一文及回复

Javascript 相关文章推荐
JavaScript 学习笔记 Black.Caffeine 09.11.28
Nov 30 Javascript
基于jquery的仿百度搜索框效果代码
Apr 11 Javascript
JavaScript学习笔记(二) js对象
Oct 25 Javascript
jQuery学习笔记 更改jQuery对象
Sep 19 Javascript
JavaScript 变量、作用域及内存
Apr 08 Javascript
浅析angularJS中的ui-router和ng-grid模块
May 20 Javascript
jquery 实现回车登录详解及实例代码
Oct 23 Javascript
15个非常实用的JavaScript代码片段
Dec 18 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
Jan 26 Javascript
react-redux中connect()方法详细解析
May 27 Javascript
vue.js加载新的内容(实例代码)
Jun 01 Javascript
浅谈Angular 中何时取消订阅
Nov 22 Javascript
javascript 打印页面代码
Mar 24 #Javascript
jQuery 全选效果实现代码
Mar 23 #Javascript
利用javascript移动div层-javascript 拖动层
Mar 22 #Javascript
javascript 对象定义方法 简单易学
Mar 22 #Javascript
JS array 数组详解
Mar 22 #Javascript
javascript multibox 全选
Mar 22 #Javascript
Js 获取当前日期时间及其它操作实现代码
Mar 04 #Javascript
You might like
探讨php中遍历二维数组的几种方法详解
2013/06/08 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
mysql desc(DESCRIBE)命令实例讲解
2016/09/24 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
用jscript启动sqlserver
2007/06/21 Javascript
cument.execCommand()用法深入理解
2012/12/04 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
AngularJS中处理多个promise的方式
2016/02/02 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
python在指定目录下查找gif文件的方法
2015/05/04 Python
python使用tornado实现登录和登出
2018/07/28 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
使用Python快速打开一个百万行级别的超大Excel文件的方法
2021/03/02 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
Python与C/C++的相互调用案例
2021/03/04 Python
市场营销大学生职业规划书
2014/02/25 职场文书
青年志愿者活动总结
2014/04/26 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
交通安全月活动总结
2015/05/08 职场文书
初中毕业感言300字
2015/07/31 职场文书
聘任书格式及范文
2015/09/21 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
Java详细解析==和equals的区别
2022/04/07 Java/Android