今天就说说 this 的应用。
这是一段Java代码
class B {
int x=100,y=200;
public void setX(int x) {
x=x;
}
public void setY(int x) {
this.y=y;
}
public int getXYSum() {
return x+y;
}
}
public class A {
public static void main(String args[])
{
B b=new B() ;
b.setX(-100);
b.setY(-200);
System.out.println("sum="+b.getXYSum()); //-100
}
}
上面里的 b.setX(-100); 其实并不能起到修改x值得作用,因为上面setX方法里的写法是 x=x; 如果要起到修改作用,应该使用 this 也就是改为 this.x=x; 来让this 指向b 这个对象,使得实参起到作用,而这个this 则是指向新创建的对象 b。
举个有关JavaScript的例子
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<button id="btn1" onclick="btn1();">按 钮 1</button>
<button id="btn2" onclick="btn2(event);">按 钮 2</button>
<script>
var btn = document.getElementsByTagName("button"); //捕获所有按钮
for(var i in btn){ //遍历按钮集合
btn[i].addEventListener("click", function(){
alert(this.innerHTML);
}, true); //为每个按钮对象注册一个事件处理函数,定义在捕获阶段进行响应
}
</script>
</body>
</html>
在这个例子中,this虽然在函数体内,但通过 for循环里的 btn[i].addEventListener ,使得this 能过得到指定的对象,使得功能能够发挥出来。
而在事件中使用this也可获得当前事件对象。如下
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<button id="btn" onclick="this.style.background='red';">按 钮</button>
<button id="btn" onclick="(event.srcElement?event.srcElement:event.target).style.background='red';">按 钮</button>
</body>
</html>
这个例子里就是在onclick()里使用了this ,this 指定了 id为btn的button,使用this省略了 (event.srcElement?event.srcElement:event.target) 这么一大段代码,减少工作量的同时也避开了想办法去兼容IE事件模型。
但某些情况下this并非都会表示当前事件对象
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script>
function btn1(){ //事件处理函数,函数中的this表示调用该函数的当前对象
this.style.background = "red";
}
function btn2(event){ //事件处理函数
event = event || window.event; //获取事件对象Event
var src = event.srcElement ? event.srcElement : event.target; //获取当前事件源
src.style.background = "red"; //改变当前事件源的背景色
}
</script>
</head>
<body>
<button id="btn1" onclick="btn1();">按 钮 1</button>
<button id="btn2" onclick="btn2(event);">按 钮 2</button>
</body>
</html>
出乎意料地,这次this并没有指向当前对象按钮,因为这次this指向了window对象,导致引用对象出错。
再次在原有的java代码上加上一些代码进行和上面例子对比。
class B {
int x=100,y=200;
public void setX(int x) {
x=x;
System.out.println(x); //-100,新加代码
System.out.println(this.x); //100,新加代码
}
public void setY(int y) {
this.y=y;
System.out.println(y); //-200,新加代码
System.out.println(this.y); //-200,新加代码
}
public int getXYSum() {
return x+y;
}
}
public class A {
public static void main(String args[])
{
B b=new B() ;
b.setX(-100);
b.setY(-200);
System.out.println("sum="+b.getXYSum());
}
}
如此经过对比可以发现,java方法中的this最后可以明确指定后面新建的对象b。而JavaScript的方法体中,在没有通过代码来获取具体对象的前提下,那么this则会指定window对象,因此在JavaScript中想要通过this获取目标对象,需要事先添加代码获取具体对象。另外一种避免出错的方法就是直接在 onclick ()事件中使用 this 。