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学习笔记二 之 变量
Dec 15 Javascript
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
Mar 14 Javascript
使用js正则控制input标签只允许输入的值
Jul 29 Javascript
jQuery实现“扫码阅读”功能
Jan 21 Javascript
jQuery源码解读之removeClass()方法分析
Feb 20 Javascript
javascript连续赋值问题
Jul 08 Javascript
Bootstrap每天必学之表单
Nov 23 Javascript
浅谈Angular路由守卫
Aug 26 Javascript
详细分析jsonp的原理和实现方式
Nov 20 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
Apr 09 Javascript
使用vuex缓存数据并优化自己的vuex-cache
May 30 Javascript
微信小程序拍照和摄像功能实现方法示例
Feb 01 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实现建立多层级目录的方法
2014/07/19 PHP
php网站被挂木马后的修复方法总结
2014/11/06 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
2013/11/29 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
python批量下载图片的三种方法
2013/04/22 Python
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
python通过floor函数舍弃小数位的方法
2015/03/17 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
python kmeans聚类简单介绍和实现代码
2018/02/23 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
详解Django中间件执行顺序
2018/07/16 Python
python变量命名的7条建议
2019/07/04 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
官方授权图形T恤和服装:Fifth Sun
2019/06/12 全球购物
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
C#怎么让一个窗口居中显示?
2015/10/20 面试题
师范生自我鉴定范文
2013/10/05 职场文书
自我鉴定三原则
2014/01/13 职场文书
小区消防演习方案
2014/02/21 职场文书
党员公开承诺书范文
2014/03/25 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
2015银行年终工作总结范文
2015/05/26 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
golang特有程序结构入门教程
2021/06/02 Python