201711671208 《Java程序设计》 第六周学习计划

今天就说说 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 。

猜你喜欢

转载自blog.csdn.net/u011633428/article/details/83120017
今日推荐