js面向对象 之 this 指向

         在开发过程中, 随着业务逻辑,使用模式等越来越复杂,通过显式传递上下文对象会让代码变得越来越混乱, 而使用this则不会这样。

        尤其是在用到JS 对象 和 原型时,函数可以自动引用合适的上下文对象时有多重要, 然而,this 提供了一种比较优雅的隐式传递方式来传递对象,因此在开发过程中使 代码 变得更加简洁、快速、且便易于复用。

1、函数中的this指向:

console.log('这是JS中最上层初始的this===================');  // window
console.log(this);  // window


document.getElementById("btn").onclick = function () {
    console.log('\n\n这是点击按扭事件下的this:===================');
    console.log(this);

    //将点击按扭事件下的this保存
    var _this = this;

    function fn() {
        console.log('\n\n原本以为这里面的this指向的是btn,然而却是Window===================');
        console.log(this); // window

        //如果想让这里的this不是指向window的话,可以在外上面先将点击按扭事件下的this保存到一个变量中,再调变量调this
        console.log('\n\n如果想让这里的this不是指向window的话,可以在外上面先将点击按扭事件下的this保存到一个变量中,再调变量调this===================');
        console.log(_this); // btn
    };

    //调用
    fn();

    /*
     * 在JS中: call(),bind(),apply() 这3个函数的都是用来改变this的指向的,它接收的第一个参数即是上下文对象并将其赋给this。
     * 使用call和apply会直接执行这个函数,
     * 而bind并不直接执行,而是将绑定好的this重新返回一个新函数,什么时候调用由你自己决定。
    */

    //例如1:
    function fn2() {
        console.log(_this); // btn
    };

    fn2.call(this);  //直接执行
    //fn2.apply(this); 


    //例如2:
    var fn3 = function () {
        console.log(_this); // btn
    }.bind(this);

    fn3();//绑定this重新返回一个新函数


    //例如3:
    (function () {
        console.log(_this); // btn
        //}.call(this));
    }.apply(this)); //直接执行
};

 

2、面向对象、类中的this指向:

var ClassFn = function () {
    console.log('\n\n这是类里的this:==================='); // ClassFn
    console.log(this); // ClassFn
    this.name = "请在控制面板console中查看this";

    this.showName = function () {
        console.log('\n\n这是类里的 公有、特权方法(外界可以访问)的this:===================');
        console.log(this);

        alert(this.name);
    };
};

ClassFn.prototype.Close = function () {
    console.log('\n\n这是类里的原型下的this:===================');
    console.log(this);

    if (confirm("你确定要关闭窗口吗?")) {
        window.close();
    } else {
        alert("你怕了,居然不敢关!哈哈!");
        var _this = this;
        function show() {
            console.log('\n\n这是类里的原型下的私有的this:===================');
            console.log(this);

            //alert(_this.showName('Web前端'));
            document.body.style.background = 'red';
        };
        show();
    }
};

//调用: 注! 只要是类, 就一定要通过 new 关键字来进行实例化以后再调用!!!
var C = new ClassFn();
C.showName();

document.querySelector('#close').addEventListener('click', function () {
    console.log('\n\n这是点击按扭事件下的this:===================');
    console.log(this);

    C.Close();
}, false);

在JavaScript中应注意以下要素:

     1.this永远指向函数运行时所在的对象!而不是函数被创建时所在的对象。

     2.this对象是在运行时基于函数的执行环境绑定的,在全局环境中,this等于window。

     3.this跟函数的定义没关系,跟函数的执行有大大的关系。所以“函数在哪里调用才决定了this到底引用的是啥。

     4.当函数作为对象的方法调用时,this指向该对象(简间地说:谁调用我,我就指向谁)。

     5.当函数作为淡出函数调用时,this指向全局对象(严格模式【"use strict";】时,为undefined)。

     6.构造函数中的this指向新创建的对象。

     7.嵌套函数中的this不会继承上层函数的this,如果需要,可以用一个变量保存上层函数的this,当在函数中使用了this,只有在该函数直接被某对象调用时,该this才指向该对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值