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 判断函数类型完美解决方案
Sep 02 Javascript
Javascript继承机制的设计思想分享
Aug 28 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
Aug 05 Javascript
jQuery常用知识点总结以及平时封装常用函数
Feb 23 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
Aug 05 Javascript
原生js仿jquery实现对Ajax的封装
Oct 04 Javascript
angular directive的简单使用总结
May 24 Javascript
js实现文字列表无缝滚动效果
Jun 23 Javascript
vue-cli监听组件加载完成的方法
Sep 07 Javascript
详解如何用VUE写一个多用模态框组件模版
Sep 27 Javascript
React SSR样式及SEO的实践
Oct 22 Javascript
vue打开其他项目页面并传入数据详解
Nov 25 Vue.js
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过滤危险html代码
2008/08/18 PHP
PHP将session信息存储到数据库的类实例
2015/03/04 PHP
php生成验证码函数
2015/10/20 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
PHP时间处理类操作示例
2018/09/05 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
jQuery DOM操作小结与实例
2010/01/07 Javascript
jQuery学习笔记之DOM对象和jQuery对象
2010/12/22 Javascript
js 函数的副作用分析
2011/08/23 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
解决layui laydate 时间控件一闪而过的问题
2019/09/28 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
python实现爬取千万淘宝商品的方法
2015/06/30 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
html5 input属性使用示例
2013/06/28 HTML / CSS
阿迪达斯芬兰官方网站:adidas芬兰
2017/01/30 全球购物
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
《曹刿论战》教学反思
2014/03/02 职场文书
职业女性的职业规划
2014/03/04 职场文书
村庄绿化方案
2014/05/07 职场文书
委托书英文
2015/01/28 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书