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 相关文章推荐
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
Dec 26 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
Jun 18 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
Jun 05 Javascript
JS实现选项卡实例详解
Nov 17 Javascript
基于jQuery实现滚动切换效果
Dec 02 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
Dec 19 Javascript
JS实现将二维数组转为json格式字符串操作示例
Jul 12 Javascript
axios异步提交表单数据的几种方法
Aug 11 Javascript
js tab栏切换代码实例解析
Sep 03 Javascript
p5.js临摹动态图形实现方法详解
Oct 23 Javascript
vue-cli创建的项目中的gitHooks原理解析
Feb 14 Javascript
JavaScript中时间格式化新思路toLocaleString()
Nov 07 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 daodb插入、更新与删除数据
2009/03/19 PHP
域名和cookie问题(域名后缀)
2012/10/10 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
php简单统计中文个数的方法
2016/09/30 PHP
php微信开发之关注事件
2018/06/14 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
js tab 选项卡
2009/04/26 Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
2011/01/12 Javascript
最简单的js图片切换效果实现代码
2011/09/24 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
python实现机器人行走效果
2018/01/29 Python
pycharm远程linux开发和调试代码的方法
2018/07/17 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
python3.6环境安装+pip环境配置教程图文详解
2019/06/20 Python
Python新手学习raise用法
2020/06/03 Python
Python3开发环境搭建详细教程
2020/06/18 Python
Python中生成ndarray实例讲解
2021/02/22 Python
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
电子商务专业自我鉴定
2013/12/18 职场文书
质检部职责
2013/12/28 职场文书
入党思想汇报
2014/01/05 职场文书
运动会邀请函范文
2014/02/06 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
贴吧吧主申请感言
2015/08/03 职场文书
为什么RedisCluster设计成16384个槽
2021/09/25 Redis
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫