zoukankan      html  css  js  c++  java
  • 面向对象的this指向

    1 、OOP的基础问题

    1.1什么是面向过程和面向对象?

    面向过程:专注于如何去解决一个问题的过程步骤。编程特点是由一个个的函数去实现每一步的过程步骤,没有类和对象的概念。

    面向对象:专注于由哪一个对象来解决这个问题。编程特点是出现了一个个的类,从类中拿到这个对象,由这个对象去解决具体的问题。

    对于调用者来说,面向过程需要调用者自己去实现各种函数。而面向对象,只需要告诉调用者对象中具体方法的功能,而不需要调用者了解方法中的实现细节。

    1.2面向对象的三大特征

    继承、封装、多态

    1.3类和对象的关系

    ① 类:一类具有相同特征(属性)和行为(方法)的集合。

    比如:人类-->属性:身高、体重、性别 方法:吃饭、说话、走路

    ② 对象:从类中,拿出具有确定属性值和方法的个体。

    比如:张三-->属性:身高180、体重180 方法:说话-->我叫张三,身高180

    ③ 类和对象的关系

    类是抽象的,对象是具体的(类是对象的抽象化,对象是类的具体化)

    解释一下:

    类是一个抽象的概念,只能说类有属性和方法,但是不能给属性赋具体的值。比如说人类有姓名,但是不能说人类的姓名叫啥。。。

    对象是一个具体的个例,是将类中的属性进行具体赋值而来的个体。比如说张三是人类的一个个体,可以说张三的姓名叫张三。也就是张三对人类的每一个属性进行了具体的赋值,那么张三就是由人类产生的一个对象。

    2、 JavaScript中的面向对象

    2.1创建类和对象的步骤

    ①创建一个类(构造函数):类名必须使用大驼峰法则,即每个单词的首字母必须大写。

    1
    2
    3
    4
    5
    6
    function 类名(属性1){
      this.属性1 = 属性1;
      this.方法 = function(){
       //方法中要调用自身属性,必须要使用this.属性
      }
    }

    ②通过类,实例化(new)出一个对象。

    var obj = new 类名(属性1的具体值);

    obj.属性; 调用属性

    obj.方法(); 调用方法

    ③注意事项

    >>>通过类名,new出一个对象的过程,叫做“类的实例化”

    >>>类中的this,会在实例化的时候,指向新new出的对象。所以,this.属性 this.方法,实际上是将属性和方法绑定在即将new出的对象上面。

    >>>在类中,要调用自身属性,必须使用this.属性名、如果直接使用变量名,则无法访问对应的属性。

    >>>类名必须使用大驼峰法则,注意与普通函数的区别。

    2.2两个重要属性constructor和instanceof

    ①constructor:返回当前对象的构造函数

    >>>zhangsan.constructor = Person; √

    ②instanceof:检测一个对象,是不是一个类的实例;

    >>>lisi instanceof Person √ lisi是通过Person类new出的

    >>>lisi instanceof Object √ 所有对象都是Object的实例

    >>>Person instanceof Object √ 函数本身也是对象

    3、 JavaScript中的this指向问题

    在上一部分中,我们创建了一个类,并通过这个类new出了一个对象。 但是,这里面出现了大量的this。 很多同学就要懵逼了,this不是“这个”的意思吗?为什么我在函数里面写的this定义的属性,最后到了函数new出的对象呢??

    3.1谁最终调用函数,this就指向谁!

    ① this指向谁,不应该考虑函数在哪声明,而应该考虑函数在哪调用!!

    ② this指向的,永远只可能是对象,不可能是函数!!

    ③ this指向的对象,叫做函数的上下文context,也叫函数的调用者。

    3.2this指向的规律(与函数的调用方式息息相关!)

    ① 通过函数名()调用的,this永远指向window

    1
    2
    func(); // this--->window
    //【解释】 我们直接用一个函数名()调用,函数里面的this,永远指向window。

    ② 通过对象.方法调用的,this指向这个对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 狭义对象
     var obj = {
      name:"obj",
      func1 :func
     };
     obj.func1(); // this--->obj
    //【解释】我们将func函数名,当做了obj这个对象的一个方法,然后使用对象名.方法名, 这时候函数里面的this指向这个obj对象。
     
     // 广义对象
     document.getElementById("div").onclick = function(){
      this.style.backgroundColor = "red";
    }; // this--->div
    //【解释】对象打点调用还有一个情况,我们使用getElementById取到一个div控件,也是一种广义的对象,用它打点调用函数,则函数中的this指向这个div对象。

    ③ 函数作为数组的一个元素,用数组下标调用,this指向这个数组

    1
    2
    3
    var arr = [func,1,2,3];
    arr[0](); // this--->arr
    //【解释】这个,我们把函数名,当做数组中的一个元素。使用数组下标调用,则函数中的this将指向这个数组arr。

    ④ 函数作为window内置函数的回调函数使用,this指向window。比如setTimeout、setInterval等

    1
    2
    3
    setTimeout(func,1000);// this--->window
    //setInterval(func,1000);
    //【解释】使用setTimeout、setInterval等window内置函数调用函数,则函数中的this指向window。

    ⑤ 函数作为构造函数,使用new关键字调用,this指向新new出的对象

    1
    2
    var obj = new func(); //this--->new出的新obj
    //【解释】这个就是第二部分我们使用构造函数new对象的语句,将函数用new关键字调用,则函数中的this指向新new出的对象。

    3.3关于this问题的面试题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    var fullname = 'John Doe';
    var obj = {
      fullname: 'Colin Ihrig',
      prop: {
        fullname: 'Aurelio De Rosa',
        getFullname: function() {
          return this.fullname;
        }
      }
    };
    console.log(obj.prop.getFullname());
    // 函数的最终调用者 obj.prop
        
    var test = obj.prop.getFullname;
    console.log(test());
    // 函数的最终调用者 test() this-> window
        
    obj.func = obj.prop.getFullname;
    console.log(obj.func());
    // 函数最终调用者是obj
        
    var arr = [obj.prop.getFullname,1,2];
    arr.fullname = "JiangHao";
    console.log(arr[0]());
    // 函数最终调用者数组
    努力到无能为力,拼搏到感动自己。 欢迎大家在下方多多评论。
  • 相关阅读:
    angular.js 头部默认值,不使用json提交数据
    D1-FFmpeg拼接视频
    B23-Carthage的使用
    B22-SVN在iOS开发的使用中遇到的问题
    C4-Cordova在iOS平台的使用
    C2-PhoneGap的环境搭建及iOS项目创建
    C0-PhoneGap之移动开发策略的选择(翻译)
    C1-PhoneGap和Cordova的关系和认识
    B21-iOS 开发的一些tips(下)
    B17-禅与 Objective-C 编程艺术的阅读笔记
  • 原文地址:https://www.cnblogs.com/wasbg/p/11056682.html
Copyright © 2011-2022 走看看