Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[JavaScript] 面向对象编程

[JavaScript] 面向对象编程

作者头像
DevKevin
发布于 2025-01-26 16:20:50
发布于 2025-01-26 16:20:50
11800
代码可运行
举报
文章被收录于专栏:Base_CDNKevinBase_CDNKevin
运行总次数:0
代码可运行

JavaScript 是一种多范式语言,既支持函数式编程,也支持面向对象编程。在 ES6 引入 class 语法后,面向对象编程在 JavaScript 中变得更加易于理解和使用。以下将详细讲解 JavaScript 中的类(class)、构造函数(constructor)、继承、封装、多态,以及 this 的相关问题。


1. 为什么需要类与面向对象编程?

面向对象编程(Object-Oriented Programming,OOP)是一种以“对象”为核心的编程思想。通过类与对象的概念,可以更好地模拟现实世界的实体,提升代码的可重用性、可维护性和扩展性。

在 JavaScript 早期,使用函数和原型链实现面向对象的思想,语法复杂且容易出错。引入 class 后,语法更加直观。


2. 类(class)与构造函数(constructor)

2.1 类的基本语法

class 是用来定义对象蓝图的关键字,其中包含对象的属性和方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person {
    // 构造函数:定义对象的初始化逻辑
    constructor(name, age) {
        this.name = name; // this 代表当前实例
        this.age = age;
    }

    // 定义实例方法
    sayHello() {
        console.log(`Hello, my name is ${this.name}.`);
    }
}

// 创建类的实例
const person1 = new Person("Kevin", 25);
console.log(person1.name); // 输出:Kevin
person1.sayHello(); // 输出:Hello, my name is Kevin.

2.2 为什么需要构造函数?

constructor 是类的特殊方法,用于在创建对象时初始化属性。它的主要作用是:

  1. 设置对象的初始状态。
  2. 为每个实例创建唯一的属性。

2.3 静态方法(static methods)

静态方法是直接定义在类上的方法,而不是在实例上的方法。静态方法通常用于创建工具类或与实例无关的逻辑。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MathUtils {
    static add(a, b) {
        return a + b;
    }
}

console.log(MathUtils.add(2, 3)); // 输出:5

3. 继承

继承允许我们定义一个类,继承另一个类的属性和方法,从而实现代码复用。

3.1 基本语法

使用 extends 实现继承,并通过 super() 调用父类的构造函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Animal {
    constructor(name) {
        this.name = name;
    }

    makeSound() {
        console.log(`${this.name} is making a sound.`);
    }
}

class Dog extends Animal {
    constructor(name, breed) {
        super(name); // 调用父类的构造函数
        this.breed = breed;
    }

    makeSound() {
        console.log(`${this.name}, a ${this.breed}, barks.`);
    }
}

const dog = new Dog("Buddy", "Golden Retriever");
dog.makeSound(); 
// 输出:Buddy, a Golden Retriever, barks.

3.2 为什么需要继承?
  1. 代码复用:子类可以直接使用父类的属性和方法,避免重复代码。
  2. 逻辑扩展:子类可以添加自己的方法或重写父类的方法,实现特定功能。

4. 封装

封装是指将对象的内部状态隐藏起来,通过方法暴露必要的操作。这样可以保护数据的安全性,避免外部直接修改。

4.1 在 JavaScript 中实现封装
  1. 私有属性(ES6 之前的实现): 通过闭包模拟私有属性。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Person(name) {
    let _name = name; // 私有变量

    this.getName = function () {
        return _name;
    };

    this.setName = function (newName) {
        _name = newName;
    };
}

const person = new Person("Kevin");
console.log(person.getName()); // 输出:Kevin
person.setName("Feng");
console.log(person.getName()); // 输出:Feng
  1. 私有属性(ES6 新特性): 使用 # 定义真正的私有属性。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person {
    #name;

    constructor(name) {
        this.#name = name;
    }

    getName() {
        return this.#name;
    }

    setName(newName) {
        this.#name = newName;
    }
}

const person = new Person("Kevin");
console.log(person.getName()); // 输出:Kevin
person.setName("Feng");
console.log(person.getName()); // 输出:Feng

5. 多态

多态是指不同的类在调用相同方法时,可以表现出不同的行为。这通常通过**方法重写(Method Overriding)**实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Animal {
    makeSound() {
        console.log("Animal is making a sound.");
    }
}

class Dog extends Animal {
    makeSound() {
        console.log("Dog is barking.");
    }
}

class Cat extends Animal {
    makeSound() {
        console.log("Cat is meowing.");
    }
}

const animals = [new Dog(), new Cat()];
animals.forEach(animal => animal.makeSound());
// 输出:
// Dog is barking.
// Cat is meowing.

6. this 指向问题

6.1 为什么会有 this?

this 是 JavaScript 中一个动态绑定的关键字,其指向取决于函数的调用方式。


6.2 this 的常见指向规则
  1. 默认指向(全局对象): 在非严格模式下,普通函数调用中的 this 指向全局对象 window
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function showThis() {
    console.log(this);
}
showThis(); // 输出:window(浏览器环境下)
  1. 方法调用: 在对象的方法中,this 指向调用方法的对象。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const obj = {
    name: "Kevin",
    showThis() {
        console.log(this);
    },
};
obj.showThis(); // 输出:obj 对象本身
  1. 构造函数中的 this: 在构造函数中,this 指向新创建的对象。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Person(name) {
    this.name = name;
}
const person = new Person("Kevin");
console.log(person.name); // 输出:Kevin
  1. 箭头函数中的 this: 箭头函数不会创建自己的 this,而是从外部作用域继承 this
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const obj = {
    name: "Kevin",
    showThis: () => {
        console.log(this);
    },
};
obj.showThis(); // 输出:window 或 undefined(严格模式下)

6.3 解决 this 指向问题
  1. **使用 **bind
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const obj = { name: "Kevin" };
function showName() {
    console.log(this.name);
}
const boundShowName = showName.bind(obj);
boundShowName(); // 输出:Kevin
  1. 使用箭头函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const obj = {
    name: "Kevin",
    showThis() {
        const arrow = () => console.log(this.name);
        arrow();
    },
};
obj.showThis(); // 输出:Kevin

总结

JavaScript 的面向对象编程非常灵活,类的引入让代码更加清晰和直观。在实际开发中,熟练掌握类与对象、继承、封装、多态,以及 this 的指向规则,可以让你写出更加高效和可维护的代码。如果有任何疑问或需要补充代码示例,欢迎随时交流!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面向对象编程
面向对象把构成问题的transaction分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为,意在写出通用代码,加强代码重用,屏蔽差异性。
子舒
2022/06/09
7200
面向对象编程
JavaScript 面向对象
类是用于定义对象的模板或蓝图;它包含对象的属性和方法,我们可以使用class关键字来定义类。
久绊A
2023/03/25
3180
JavaScript面向对象编程-第三版不完全系统解读
关于JavaScript的百度说法,我们这里就不贴出来了,因为太多了,也找不到标准。烦请大家自行参考,方便自己理解。我们这里只给针对专业权威书籍《Object-Oriented JavaScript, 3rd Edition》(“JavaScript面向对象编程第三版“--这是本人参考翻译)的解读,希望可以帮助大家深入理解现代的JavaScript编程语言的最大强功能--面向对象编程。书中这样描述:
老九君
2021/05/31
5300
《现代Javascript高级教程》面向对象之Class
随着JavaScript的发展,ECMAScript 6(ES6)引入了许多新的语言特性和语法糖,其中包括了面向对象编程的Class(类)机制。Class提供了一种更简洁、更直观的方式来定义对象和操作对象的行为。本文将介绍ES6中Class的概念、语法和特性,并通过示例代码来说明其实际应用。
linwu
2023/07/27
2560
万字长文深度剖析面向对象的javascript
本将会深入讲解面向对象在javascript中的应用,并详细介绍三种对象的生成方式:构造函数,原型链,类。
程序那些事
2020/12/14
3530
面向对象编程
面向对象对每一个程序员来说,非常熟悉,在C语言里,我们说它是面向过程,在java中我们熟悉的面向对象三大特征中封装、继承、多态,java是高级语言,在BS架构中,后端语言用java等语言运行在服务器上,而在离用户端最近的B端,js中也有面相对象。
Maic
2022/07/28
6430
面向对象编程
JavaScript学习笔记018-面向对象编程思维0构造函数0Class
Author:Mr.柳上原 付出不亚于任何的努力 愿我们所有的努力,都不会被生活辜负 不忘初心,方得始终 学习真是永无止境啊 学完html还有css 学完css还有JavaScript 学完js还有jQuery 学完jq还有H5 学完H5还有css3 学完css3还有Nodejs 学完node还有Vuejs 学完Vue发现招聘简历上还有css预处理Sass,Less,Stylus 还有Bootstrap 还有React + Redux 还有Angular 还有...... <!DOCTYPE html> <
Mr. 柳上原
2018/09/05
4570
JavaScript学习总结(四)——this、原型链、javascript面向对象
根据题目要求,对给定的文章进行摘要总结。
张果
2018/01/04
1.5K0
JavaScript学习总结(四)——this、原型链、javascript面向对象
探索JavaScript面向对象编程的魅力与用途
在前端开发中,JavaScript是一门非常重要的语言。它不仅可以用于实现交互和动态效果,还可以通过面向对象编程的方式构建复杂的应用程序。本文将深入探索JavaScript面向对象编程的魅力和用途,帮助读者更好地理解和应用该编程思维方式。
李才哥
2023/06/23
1960
探索JavaScript面向对象编程的魅力与用途
JavaScript 进阶教程(1)--面向对象编程
一本书、一辆汽车、一个人都可以是对象,一个数据库、一张网页、一个与远程服务器的连接也可以是对象。当实物被抽象成对象,实物之间的关系就变成了对象之间的关系,从而就可以模拟现实情况,针对对象进行编程。
AlbertYang
2020/09/08
5340
JavaScript 进阶教程(1)--面向对象编程
JavaScript 面向对象(封装、继承、多态)多种方式实现完全总结
封装就是把抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作。 创建对象实现封装可以通过4种方式: 1. 对象字面量 {key:value,key:value…} 只能创建一次对象,复用性较差,如果要创建多个对象,代码冗余度太高 2. 内置构造函数 var obj = new Object();obj.name = “csxiaoyao”; 3. 简单工厂函数 function createObj(name,company){var obj =new Object();obj.name = name;return obj;} 4. 自定构造函数
csxiaoyao
2019/02/15
1.4K0
JS面向对象编程
通过instanceof来判断当前的的对象是否是实例化出来的,如果是实例化出来的this指向实例化出来的对象,也就是这里的Person,否则作为普通函数来说当前的this指向window
小丞同学
2021/08/16
4.1K0
JavaScript 面向对象
创建函数 Foo 的时候,就会有一个内置的 Foo.prototype 属性,并且这个属性是对象。
零式的天空
2022/03/02
2860
适合初学者学习的面向对象编程(OOP)入门指南
类是一种蓝图,用来创建对象。它定义了对象将拥有的属性和方法。就像建房子的图纸一样,图纸决定了房子的结构和功能,但并不是真正的房子。
前端达人
2024/06/27
3670
适合初学者学习的面向对象编程(OOP)入门指南
30天拿下Python之面向对象编程
在上一节,我们介绍了Python的函数,包括:函数的定义、函数的调用、参数的传递、lambda函数等内容。在本节中,我们将介绍Python的面向对象编程。面向对象编程(Object-Oriented Programming, 即OOP)是一种编程范型,它以对象为基础,将数据和操作封装在一个类(Class)中。在Python中,类是一种定义对象结构和行为的模板,而对象则是类的实例。类定义了一个新的类型,用于创建具有特定属性和方法的对象。类是面向对象编程的核心,它允许程序员使用对象来组织代码和复用代码。
用户6256742
2024/06/22
940
《深入探秘JavaScript原型链与继承机制:解锁前端编程的核心密码》
在JavaScript的奇妙世界里,原型链与继承机制犹如隐藏的宝藏,掌握它们,就如同拿到了开启高效编程大门的钥匙。对于前端开发者来说,这不仅是写出简洁、可维护代码的关键,更是深入理解JavaScript面向对象编程的基石。今天,就让我们一同揭开它们神秘的面纱。
程序员阿伟
2025/04/18
880
《深入探秘JavaScript原型链与继承机制:解锁前端编程的核心密码》
js面向对象编程_JavaScript高级编程
面向过程即分析出解决问题所需要的步骤,然后用函数将这些步骤一步步实现,使用的时候再一个个的一次调用就可以了;
全栈程序员站长
2022/09/24
1.2K0
js面向对象编程_JavaScript高级编程
Python面向对象编程:深入理解类、对象、继承和多态
面向对象编程(Object-Oriented Programming,OOP)是一种强大的编程范式,它将数据和操作数据的方法组织成对象。Python是一门多范式的编程语言,支持面向对象编程,本文将深入探讨Python中的OOP概念,包括类、对象、继承、多态等,以帮助你更好地理解和应用面向对象编程。
海拥
2023/09/19
4460
Python面向对象编程:深入理解类、对象、继承和多态
JS与ES6高级编程学习笔记(三)——JavaScript面向对象编程
面向对象程序编程(Object-oriented programming,缩写:OOP)是用抽象方式构建基于现实世界模型的一种编程模式,JavaScript是一种基于对象(object-based)的语言,支持面向对象编程与函数式编程,但JavaScript的面向对象与其它的面向对象语言有较大差异,ECMAScript中没有类的概念,所以对象也有所不一样。
张果
2022/06/06
7910
JS与ES6高级编程学习笔记(三)——JavaScript面向对象编程
JavaScript 高级程序设计(第 4 版)- 对象、类与面向对象编程
通过字面量来重写原型时,Person.prototype被设置为等于一个通过对象字面量创建的新对象,此时Person.prototype的constructor属性就不指向Person了
Cellinlab
2023/05/17
6610
JavaScript 高级程序设计(第 4 版)- 对象、类与面向对象编程
推荐阅读
相关推荐
面向对象编程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验