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操作Cookies的实现代码
Oct 09 Javascript
jquery插件制作 自增长输入框实现代码
Aug 17 jQuery
jquery实现的随机多彩tag标签随机颜色和字号大小效果
Mar 27 Javascript
判断window.onload是否多次使用的方法
Sep 21 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
Feb 19 Javascript
jQuery纵向导航菜单效果实现方法
Dec 19 Javascript
js实现文本上下来回滚动
Feb 03 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
Aug 10 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
Feb 20 jQuery
Vue 事件处理操作实例详解
Mar 05 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
Jun 03 Javascript
vue页面加载时的进度条功能(实例代码)
Jan 13 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轻松实现文件上传功能
2016/03/03 PHP
php微信公众平台示例代码分析(二)
2016/12/06 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
2017/06/12 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
js 浮动层菜单收藏
2009/01/16 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
使用JavaScript获取地址栏参数的方法
2014/12/19 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
基于node.js依赖express解析post请求四种数据格式
2017/02/13 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
Python性能优化技巧
2015/03/09 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
python实现超级玛丽游戏
2020/03/18 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
python进行参数传递的方法
2020/05/12 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
前台领班岗位职责
2013/12/04 职场文书
校园报刊亭创业计划书
2014/01/02 职场文书
大学生学习党课思想汇报
2014/01/03 职场文书
投资合作协议书
2014/04/17 职场文书
设计顾问服务计划书
2014/05/04 职场文书
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
JavaScript函数柯里化
2021/11/07 Javascript
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android
Java 超详细讲解hashCode方法
2022/04/07 Java/Android
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis