事件驱动的JScript面对象编程
来源:互联网 发布:linux内核多线程 编辑:程序博客网 时间:2024/06/03 01:23
在这里分享一下我对JScript的面对象编程的一些认识和一点解决方案。JScript和JavaScript差不多(当然有所不同),但本文中讲到的内容也可用于JavaScriptXML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
JScript支持面对象的一些属性,但他的this指针很奇怪,当有一个对象obj1中的一个成员函数用到this,如果有别一个对象obj2引用该函数,那这个this指向的不是obj1,而是obj2。
下面我们来看一个例子:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>无标题文档</title></head>
<body>
<p id="text">this is the element "p"</p>
<script language="jscript">
function obj1(){ //类obj1
this.innerText = "this is obj1";
}
function obj1.prototype.fun(){
alert(this.innerText);
}
var o1 = new obj1; //对象o1
o1.fun(); //显示“this is obj
text.onclick = o1.fun; //把对象o1的成员函数绑定到HTML元素text中,这是再点击“this is the element “p”。你会发现显示的是this is the element “p”,而不是this is obj1。
</script>
</body></html>
从上面的例子中我们可以知道JScrpt中函数引用只是引用了函数的入口,并没有保存对象的引用。而this只是简单的指向调用函数的对象而已。JScript并无对象指针这种东西(可能我不知道,如果看文章的您知道的话,请告诉我(QQ:123737))。
在我们通常写一些要处理HTML元素的onclick事件的时候,我们会这样写
方法一:
<script language="jscript">
function fun(obj){
alert(obj.innerText);
}
</script>
<p id="text" onclick="fun(this) ">element</p>
方法二:
<p id="text">element</p>
<script language="jscript">
function fun(){
alert(this.innerText);
}
text.onclick = fun;
</script>
上面两个方法的动行结果是一样的,可能你会发现方法一的onclick="fun(this) "直现一些。方法二的fun更理性些。但方法一的fun(this)的this太麻烦了,把代码改成:
<script language="jscript">
function fun(){
alert(this.innerText);
}
</script>
<p id="text" onclick="fun()">element</p>
你会发现这个脚本是不能工作的。为什么??
当你用方法一书写时,实际上这时onclick的处理事件是这样的:
function anonymous() { fun(this) }
也就是说IE为onclick事件创造了一个匿名函数,并在函数中调用了fun函数。由于调用anonymous的是对象text,所以this就把text的引用传给了fun函数。这时fun中的形参obj就指向text。如果您把事件绑定写成:
<p id="text" onclick="fun()">element</p>
则由于调用fun()的是函数anonymous而不是对象text,所以如果您在fun中使用this的话,这里this是不指向任何地方的。如果您alter(this)的话,您会发现他的值是undefined。
在方法二中,onclick的处理事件就是fun,所以this是可用的,它指向text。但您千万不要把方法二中fun的定义写成:
function fun(obj){
alert(obj.innerText);
}
当text响应onclick事件调用onclick时是不传递任何参数给fun的,这时obj就是undefined了。
问题已经明确,但当我们要响应HTML的事件,而处理的信息又是存在于对象中时又该怎么办呢?(当然处理方法是基于纯事件驱动的)
我们可以这样:
<p id="text">click this</p>
<script language="jscript">
function obj(){
this.innerText = "this is obj";
}
function obj.prototype.fun(){
var self = this.obj; //得到obj1的引用。学过Delphi的都知道self是什么意思
//JScript中this是不能重新赋值的,所以用self。学过Delphi的人都知道self是什么意思
alert(self.innerText);
}
var obj1 = new obj;
text.obj = obj1; //给text添加一个新的属性obj,并赋于obj1的引用。
text.onclick = obj1.fun;
</script>
点击click this结果显示"this is obj"。
使用该方法就可以用JScript纯事件驱动的程序了。
- 事件驱动的JScript面对象编程
- 事件驱动的JScript面对象编程
- 事件驱动的JScript面对象编程
- 事件驱动的JScript面对象编程(例)
- 事件驱动的JScript面对象编程(例)
- 事件驱动的JScript面对象编程(例)
- 事件驱动的JScript面对象编程(例)
- 事件驱动的JScript面对象编程 选择自 Mykxxx 的 Blog
- 事件驱动的JScript面对对象编程(例)
- java 面对象的思想
- 面对象
- Ruby简介 完全面对象 脚本 从人的角度编程(强大反射)
- JAVA之面对象
- JAVA面对象二
- java面对象四
- 面对象实例
- 【木头Cocos2d-x 025】状态机篇(第04章) --事件驱动,你想象不到的强大
- 【木头Cocos2d-x 025】状态机篇(第04章) --事件驱动,你想象不到的强大
- WIFI手机将登陆上海 打国际长途每分钟0.3元
- IBM的发展史
- UML and Bugfree Site
- log4j使用进阶
- Linux中文件的压缩与解压缩
- 事件驱动的JScript面对象编程
- L i n u x 常 用 指 令 集
- 福布斯:苹果30年最伟大的20个瞬间
- 配置log4j的日志自动分为每天一个文件
- Java学习从入门到精通
- 使用PostgreSQL数据库做PHP开发
- 如何在C#去求矩阵的逆矩阵
- Response.ContentType 所有类型
- 如何用正确的方法来写出质量好的软件的75条体会