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脚本
Aug 04 Javascript
jquery mobile changepage的三种传参方法介绍
Sep 13 Javascript
利用js(jquery)操作Cookie的方法说明
Dec 19 Javascript
js实现上传图片预览的方法
Feb 09 Javascript
简介JavaScript中substring()方法的使用
Jun 06 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
Dec 01 Javascript
原生JS实现几个常用DOM操作API实例
Jan 19 Javascript
vue-quill-editor富文本编辑器简单使用方法
Sep 21 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
Nov 15 Javascript
webpack优化的深入理解
Dec 10 Javascript
vue 获取视频时长的实例代码
Aug 20 Javascript
jquery将json转为数据字典的实例代码
Oct 11 jQuery
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/01/23 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
javascript学习笔记--数字格式类型
2014/05/22 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
Python实现字符串匹配的KMP算法
2019/04/04 Python
详解DeBug Python神级工具PySnooper
2019/07/03 Python
Python 面向对象之封装、继承、多态操作实例分析
2019/11/21 Python
银河香水:Galaxy Perfume
2019/03/25 全球购物
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
物业管理计划书
2014/01/10 职场文书
人民教师求职自荐信
2014/03/12 职场文书
cf收人广告词大全
2014/03/14 职场文书
授权委托书格式范文
2014/08/02 职场文书
医院护士党的群众路线教育实践活动对照检查材料思想汇报
2014/10/04 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
如何获取numpy array前N个最大值
2021/05/14 Python
解析原生JS getComputedStyle
2021/05/25 Javascript
JavaScript实现简单计时器
2021/06/22 Javascript
app场景下uniapp的扫码记录
2022/07/23 Java/Android