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使用手册之一
Mar 24 Javascript
滚动图片效果 jquery实现回旋滚动效果
Jan 08 Javascript
jQuery基本过滤选择器使用介绍
Apr 18 Javascript
javascript自启动函数的问题探讨
Oct 05 Javascript
SeaJS 与 RequireJS 的差异对比
Dec 08 Javascript
js实现仿百度瀑布流的方法
Feb 05 Javascript
微信小程序  audio音频播放详解及实例
Nov 02 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
Dec 21 Javascript
React Native 使用Fetch发送网络请求的示例代码
Dec 02 Javascript
简单的Vue SSR的示例代码
Jan 12 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
Apr 27 Javascript
JavaScript实现显示和隐藏图片
Apr 29 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 session和cookie使用说明
2010/04/07 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
PHP开发实现微信退款功能示例
2017/11/25 PHP
js wmp操作代码小结(音乐连播功能)
2008/11/08 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
7个JS基础知识总结
2014/03/05 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
javascript去除空格方法小结
2015/05/21 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
jquery uploadify隐藏上传进度的实现方法
2017/02/06 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
使用Python的内建模块collections的教程
2015/04/28 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
2016/07/15 Python
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
python 穷举指定长度的密码例子
2020/04/02 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
毕业生的自我评价分享
2013/12/18 职场文书
男方父母婚礼答谢词
2014/01/25 职场文书
《尊严》教学反思
2014/02/11 职场文书
2014新课程改革心得体会
2014/03/10 职场文书
财务会计实训报告
2014/11/05 职场文书
2014年节能降耗工作总结
2014/12/11 职场文书
社区服务理念口号
2015/12/25 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书
golang用type-switch判断interface的实际存储类型
2022/04/14 Golang