今天回顾了一下java基础,突然发现自己把java和JavaScript中this的概念混淆了,所以记录一下以备不时之需
java:
1.this它可以在类里面来引用这个类的属性和方法
代码:
public class Test { PRivate int x = 10; public Test(int x){ System.out.println("赋值前的全局变量"+this.x); System.out.println("形参x="+x); this.x = x; System.out.println("赋值后的全局变量"+this.x); } public static void main(String[] args) { Test t = new Test(11); }}
结果:
赋值前的全局变量10形参x=11赋值后的全局变量11
2.通过this 这个关键字返回自身这个对象
代码:
public class ThisDemo { private int count ; //全局变量Java虚拟机都会先自动给它初始化为默认值。 而局部变量不行 public ThisDemo add(){ count++; return this; } public void print(){ System.out.println("count="+count); } public static void main(String[] args) { new ThisDemo().add().add().print(); }}结果:count=2
其中初始化赋值如下
Boolean false Char '/u0000'(null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d
3.构造函数之间的调用
代码:
public class ThisDemo { String name ; int age ; public ThisDemo(){ this.age = 21; } public ThisDemo(String name,int age){ this();函数有所属对象时:指向所属对象函数有所属对象时:指向所属对象 this.name = name; } public void print(){ System.out.println("赋值后的名字"+this.name); System.out.println("赋值后的年龄"+this.age); } public static void main(String[] args) { new ThisDemo("桂纶镁",23).print(); }}
结果:
赋值后的名字桂纶镁赋值后的年龄21
javascrip:
1.函数有所属对象时:指向所属对象
代码:
var myObject = { value : 10 }; myObject.fun = function(){ var value = 100; alert(value); alert(this.value); alert(this); }; myObject.fun();
结果:100
10
Object
2.函数没有所属对象:指向全局对象(将上述代码进行小小的改动)
代码:
var myObject = { value : 10 }; myObject.fun = function(){ fun1 = function(){ alert("fun1:"+this.value); } var value = 100; alert(value); alert(this.value); alert(this); }; myObject.fun(); fun1();
结果:
100
10
Object
fun1:undefined
分析:
因为fun1()这个函数没有绑定在任何一个对象上,所以它属于window这个对象,所以它的this指的是全局变量,而全局变量没有这个value
所以就为undefined
3.构造器中的 this:指向新对象
代码:
var value = 10 ;fun = function(){ var value = 100; alert(this.value); alert(value);}fun();var f = new fun();
结果:
10
100
undefined
100
分析:我用了两次调用来区分new一个函数和普通函数的区别,很明显,当我new一个函数的时候,这时他所属的对象是f,而f没有value这个值,所以它的this.value为undefined
既然都是作用域,就扩展一下说一下apply()和call()的异同
相同点:两个方法产生的作用是完全一样的。
不同点:方法传递的参数不同
function A(){ this.flag = 'A'; this.tip = function(){ alert(this.flag); };};function B(){ this.flag = 'B';};var a = new A();var b = new B();a.tip.call(b);
a.tip.apply(b);
两次运行结果都是B,注意这里tip是属性所带的方法,之前写错了看很久才发现,apply()和call()都是function.prototype里自带的
总结一下:
java中this.value可以再本类中调用全局变量,也可以在构造器中用this()调用其他构造器,也可以用this表示当前对象
Javascript中this指的是这个函数所属的对象的值,当new一个函数时,这个this就会指向这个new出来的对象,apply()和call()可以改变一个函数中this指向的对象
新闻热点
疑难解答