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 相关文章推荐
pjblog中的UBBCode.js
Apr 25 Javascript
javascript 关闭IE6、IE7
Jun 01 Javascript
关于递归运算的顺序测试代码
Nov 30 Javascript
getComputedStyle与currentStyle获取样式(style/class)
Mar 19 Javascript
js创建对象的方法汇总
Jan 07 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
Mar 06 Javascript
原生js实现无限循环轮播图效果
Jan 20 Javascript
详解使用vue实现tab 切换操作
Jul 03 Javascript
css和js实现弹出登录居中界面完整代码
Nov 26 Javascript
Vue 中mixin 的用法详解
Apr 23 Javascript
详解使用mocha对webpack打包的项目进行&quot;冒烟测试&quot;的大致流程
Apr 27 Javascript
Vue3配置axios跨域实现过程解析
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
在MongoDB中模拟Auto Increment的php代码
2011/03/06 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
2012/05/07 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
2015/07/09 PHP
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
2016/04/15 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
vue使用nprogress加载路由进度条的方法
2020/06/04 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
python的变量与赋值详细分析
2017/11/08 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
对python文件读写的缓冲行为详解
2019/02/13 Python
Python日期时间Time模块实例详解
2019/04/15 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
python两种注释用法的示例
2020/10/09 Python
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
2014年团支部年度工作总结
2014/12/24 职场文书
英文升职感谢信
2015/01/23 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
Nginx限流和黑名单配置
2022/05/20 Servers