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 相关文章推荐
高性能web开发 如何加载JS,JS应该放在什么位置?
May 14 Javascript
仿百度输入框智能提示的js代码
Aug 22 Javascript
EasyUI中datagrid在ie下reload失败解决方案
Mar 09 Javascript
详解JavaScript基于面向对象之继承实例
Dec 16 Javascript
Javascript的表单验证长度
Mar 16 Javascript
Bootstrap显示与隐藏简单实现代码
Mar 06 Javascript
self.attachevent is not a function的解决方法
Apr 04 Javascript
vue使用Axios做ajax请求详解
Jun 07 Javascript
element-ui的回调函数Events的用法详解
Oct 16 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
Aug 21 Javascript
JavaScript canvas绘制圆弧与圆形
Feb 18 Javascript
vue.js实现照片放大功能
Jun 23 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获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
深入浅析同源策略和跨域访问
2015/11/26 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
JavaScript常见JSON操作实例分析
2018/08/08 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
[00:31]2016完美“圣”典风云人物:国士无双宣传片
2016/12/04 DOTA
python实现通过pil模块对图片格式进行转换的方法
2015/03/24 Python
python 上下文管理器使用方法小结
2017/10/10 Python
Python星号*与**用法分析
2018/02/02 Python
Python3中详解fabfile的编写
2018/06/24 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
南威尔士家居商店:Leekes
2016/10/25 全球购物
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
应届生新闻编辑求职信
2013/11/19 职场文书
火车来了教学反思
2014/02/11 职场文书
辞职信模板(中英文版)
2015/02/27 职场文书
java设计模式--建造者模式详解
2021/07/21 Java/Android