js-----初步了解this对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tacks/article/details/78698771

《开场白》
话说js里面都是对象,那么来看看今天这个this对象。this是Javascript语言的一个关键字。 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。看来也是离不开函数啊!
this的指向是,调用函数的那个对象。

this的四种调用方式

情况一:普通函数调用

this的值指向–>Window
准确的说,this为null 但被解释为window

alert(window.x);//------------------------undefined
function test(){
    this.x = 1;
    console.log(this);//---------------window
  }
test(); 
alert(window.x);//------------------------1

this最终指向的是调用它的对象,这里的函数test实际是被Window对象所点出来的,其实alert也是window的一个属性,也是window点出来的.

情况二:作为对象的方法来调用

将函数保存为对象的属性, 这样就转化为一个方法, 可以通过对象调用这个方法。当函数被当成对象的方法来调用时, 里面的 this 值就被设置为调用方法的对象。

var personA={
        name:"AAA",
        showName:function(){
            console.log(this.name);
        }
    }
var personB={
        name:"BBB",
        sayName:personA.showName;
    }
    //只关心其调用者
personB.sayName();  //-----------------输出 BBB

//作为方法调用,this指向其调用者,即母体对象。
虽然showName方法是在personA这个对象中定义,但是调用的时候却是在personB这个对象中调用,因此this对象指向personB,所以输出的时候就是BBB。

情况三:作为构造函数调用

所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this 指代new 出的对象。

function person(name){
            this.name = name;
            this.say = function(){
                alert('I am ' + this.name + '!');
            }
        }
var man = new person('tacks');
man.say();//------------------I am tacks!

这里之所以对象man可以点出函数person里面的say是因为new关键字可以改变this的指向,将这个this指向对象man.
为什么我说man是对象,因为用了new关键字就是创建一个对象实例,已经复制了一份person构造函数到对象man中,用了new关键字就等同于复制了一份。
js中没有类的概念,创建对象是用构造函数来完成或是json
new person发生了以下几个步骤
a.系统创建空对象{}
b.{空对象construcor属性指向person函数,先别管}
c.把函数的this—>指向该空对象
d.执行该函数person()
e.返回该对象man

情况四:函数被 apply call调用

所有的函数都有的两个方法, 是 apply() 和 call(). 。
我们可以通过这两个方法来改变函数的上下文, 在任何时候都有效, 用来显式地设置 this 的值。
apply() 方法接收两个参数: 第一个是要设置为 this 的那个对象, 第二个参数是可选的,如果要传入参数, 则封装为数组作为 apply() 的第二个参数即可。
call() 方法 和 apply() 基本上是一样的, 除了后面的参数不是数组, 而是分散开一个一个地附加在后面。

var name="win";
    var Person={
        name:"person",
        showName:function(){
            console.log(this.name);
        }
    }
    Person.showName.call(); //--------------输出 "win"
    //这里call方法里面的第一个参数为空,默认指向window。
    //虽然showName方法定义在Person对象里面,但是使用call方法后,
    //将showName方法里面的this指向了window。因此最后会输出"win";

《结束语》
js里真的全是对象啊

猜你喜欢

转载自blog.csdn.net/Tacks/article/details/78698771