今天回顾了一下java基础,突然发现自己把java和JavaScript中this的概念混淆了,所以记录一下以备不时之需
java:
1.this它可以在类里面来引用这个类的属性和方法
代码:
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); //这里的this指的是调用他的对象(myObject),如果没有写在myObject里面的话调用他的则是window
};
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里自带的
想让window调用的话这里可以写apply(null)或者apply(window)
总结一下:
java中this.value可以再本类中调用全局变量,也可以在构造器中用this()调用其他构造器,也可以用this表示当前对象
JavaScript中this指的是这个函数所属的对象的值,当new一个函数时,这个this就会指向这个new出来的对象,apply()和call()可以改变一个函数中this指向的对象
没有var的变量都代表的是全局变量哟