讲师中心 微信公众号
AI工具推荐 视频效率加速

为什么 JavaScript 不是“真正的”OOP

夏婷同学_5214

夏婷同学_5214

发布时间:2024-08-12 08:10:03

|

1107人浏览过

|

来源于dev.to

转载

为什么 javascript 不是“真正的”oop

javascript 是一种深受许多人喜爱的语言,但在面向对象编程 (oop) 方面,它常常受到一些不好的评价。如果您有 java、c++ 或 c# 等语言的背景,您可能听说 javascript 不是“真正的”oop 语言。但这到底意味着什么呢?让我们解开这个概念并理解为什么 javascript 与传统的 oop 语言不同。

1.基于原型的继承:核心区别

问题的核心是 javascript 对基于原型的继承的使用。在传统的 oop 语言中,您创建类,它们是对象的蓝图。这些类可以继承其他类的属性和方法,形成清晰的层次结构。

另一方面,javascript 并不以同样的方式使用类(至少在 es6 之前是这样——即使到了那时,它更多的是语法糖,但稍后会详细介绍)。相反,javascript 使用原型。 javascript 中的每个对象都有一个原型,并且对象可以直接从其他对象继承。这意味着不存在像经典 oop 语言那样的类到对象的转换。相反,物体会产生其他物体。

const animal = {
  speak() {
    console.log("animal speaks");
  }
};


const dog = object.create(animal);
dog.speak(); // output: animal speaks
//here, dog inherits directly from animal without any class in sight.

2.封装?更像是伪封装
封装是 oop 的支柱之一。它指的是数据(属性)和在单个单元或类中操作该数据的方法的捆绑,并且能够向外界隐藏内部工作原理。

javascript 传统上缺乏严格的封装,这是它不被认为是“真正的”oop 的另一个原因。在 javascript 的早期,没有官方的方法来创建私有变量——一切都是公共的,可以访问或修改。

立即学习“Java免费学习笔记(深入)”;

随着 es6 的引入,javascript 添加了类语法,最近还添加了使用 # 前缀的私有字段,这有助于封装。然而,这些功能相对较新,并且不像其他 oop 语言那样强大或强制执行。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
class animal {
  #name;

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

  getname() {
    return this.#name;
  }
}

const dog = new animal("buddy");
console.log(dog.getname()); // output: buddy
console.log(dog.#name); // syntaxerror: private field '#name' must be declared in an enclosing class

//this private field syntax helps, but the flexibility of javascript means it’s still easy to break encapsulation in other ways.

3.函数是一等公民
在 javascript 中,函数是一等公民。这意味着您可以像对待任何其他对象一样对待函数:将它们分配给变量,将它们作为参数传递给其他函数,甚至从函数返回它们。

虽然这是一个强大的功能,但这也是 javascript 不适合传统 oop 模式的另一个原因。在许多 oop 语言中,方法与类和对象紧密耦合,而 javascript 的函数独立存在,并且可以以更动态的方式使用。

function sayhello() {
  return function() {
    console.log("hello!");
  };
}

const greet = sayhello();
greet(); // output: hello!

这种灵活性对于函数式编程来说非常出色,但与经典 oop 中严格的方法-对象耦合不同。

4.动态打字:祝福和诅咒
javascript 是动态类型的,这意味着变量可以保存任何类型的值,并且它们的类型可以在运行时更改。这种动态性质与大多数 oop 语言中的严格类型系统不一致,其中类型是显式声明和强制执行的。

动态类型允许快速开发和灵活性,但它也可能导致难以预测的行为和难以追踪的错误 - 严格的 oop 语言试图通过其严格的类型系统来缓解这种情况。

let x = "hello";
x = 42; // no problem in javascript!

虽然动态类型很强大,但这也是 javascript 不能完全融入 oop 范式的又一个原因。

5.类语法:只是语法糖
在 es6 中,javascript 引入了 class 关键字,这为来自传统 oop 语言的人带来了更熟悉的语法。然而,重要的是要明白这主要是语法糖。在幕后,javascript 仍在使用其基于原型的继承系统。

class Animal {
  constructor(name) {
    this.name = name;
  }

  speak() {
    console.log(`${this.name} speaks`);
  }
}

class Dog extends Animal {
  speak() {
    console.log(`${this.name} barks`);
  }
}

const dog = new Dog("Buddy");
dog.speak(); // Output: Buddy barks

虽然这看起来像基于类的继承,但重要的是要记住 javascript 仍在使用原型在幕后做自己的事情。这可能会导致期望基于类的行为的开发人员感到困惑。

结论:js 真的是 oop 吗?
那么,javascript 真的是面向对象的吗?答案既是肯定的,也是否定的。 javascript 非常灵活,可以以面向对象的方式使用,但它不遵守传统 oop 语言的严格规则和范例。相反,javascript 提供了自己独特的原型、动态类型和函数式编程功能的混合,使其成为一种强大且多功能的语言,但不是传统意义上的“真正的”oop。

您将其视为优势还是限制很大程度上取决于您的背景和您习惯的编程类型。但有一件事是明确的:javascript 的 oop 方法是独特的,理解其细微差别将使您成为一名更好的开发人员。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

285

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

406

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

395

2025.12.24

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

7055

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

362

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

364

2026.04.09

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

243

2026.04.17

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

4236

2024.01.03

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn