JavaScript面向对象基础与this指向机制详解

作者:异步漫步

时间:2026-10-22

浏览:117

本文深入解析JavaScript面向对象编程核心概念,涵盖面向过程与面向对象的区别、类与对象的关系及创建步骤。重点阐述this关键字在不同调用场景下的指向规律,包括直接调用、对象方法调用、构造函数调用及回调函数中的行为,结合代码示例帮助开发者彻底理解JS中this的绑定机制。

文章目录

前言

前言

编程语言的发展经历了从面向机器、面向过程到面向对象的演进阶段。JavaScript作为一门基于对象的语言,其特性介于面向过程与面向对象之间。在JavaScript学习路径中,面向对象编程(OOP)占据核心地位,本文将系统梳理JS中的面向对象基础。

OOP的基础问题

1、OOP的基础问题

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

面向过程编程侧重于解决问题的具体步骤,通过一系列函数依次执行来完成逻辑,不涉及类与对象的概念。

面向对象编程则关注由哪个对象来解决特定问题。其特点是通过定义类并实例化对象,由对象负责执行具体任务。

对于调用者而言,面向过程需要手动实现各个函数;而面向对象只需关注对象提供的功能接口,无需了解内部实现细节。

1.2 面向对象的三大特征

继承、封装、多态

1.3 类和对象的关系

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

例如:人类——属性包括身高、体重、性别;方法包括吃饭、说话、走路。

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

例如:张三——属性为身高180、体重180;方法表现为说话:“我叫张三,身高180”。

③ 类和对象的关系

类是抽象概念,对象是具体实例(类是对象的抽象化,对象是类的具体化)。

解释说明:

类仅定义属性和方法的结构,不赋予具体数值。例如,“人类”有姓名属性,但不能指定具体叫谁的名字。

对象则是将类中的属性赋予具体值后的个体。例如,张三是人类的一个具体实例,其姓名被赋值为“张三”。通过对人类所有属性进行具体赋值,张三成为由人类产生的对象。

JavaScript中的面向对象

2、JavaScript中的面向对象

2.1 创建类和对象的步骤

① 创建类(构造函数):类名必须遵循大驼峰命名法,即每个单词首字母大写。


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

② 通过类实例化(new)对象。

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

obj.属性; // 调用属性

obj.方法(); // 调用方法

③ 注意事项

>>> 通过类名new出对象的过程称为“类的实例化”。

>>> 类中的this在实例化时指向新创建的new对象。因此,this.属性和this.方法是将属性和方法绑定到即将生成的对象上。

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

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

2.2 两个重要属性constructor和instanceof

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

>>> zhangsan.constructor = Person; // 正确

② instanceof:检测一个对象是否属于某个类的实例。

>>> lisi instanceof Person // 正确,lisi是通过Person类new出的

>>> lisi instanceof Object // 正确,所有对象都是Object的实例

>>> Person instanceof Object // 正确,函数本身也是对象

JavaScript中的this指向问题

3、JavaScript中的this指向问题

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

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

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

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

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

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

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


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

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


// 狭义对象
 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指向这个数组


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

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


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

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


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

3.3 关于this问题的面试题


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]());
// 函数最终调用者数组

好了,这篇博客,我们了解了什么是面向对象、类和对象的关系、JS中声明类与对象的步骤,以及重点讲解的this指向问题! 希望能够帮助大家真正的理解了this的认知,下面我会继续给大家分享关于面向对象方面的问题。多谢大家的支持!!!

以上这篇老生常谈JavaScript面向对象基础与this指向问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章