java中this用法和javascript中的this用法

今天回顾了一下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);   //这里的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的变量都代表的是全局变量哟

猜你喜欢

转载自blog.csdn.net/zhutiandashen/article/details/56018146
今日推荐