如何用javascript实现面向对象编程【教程】

发布时间 - 2026-01-25 00:00:00    点击率:
JavaScript的class只是语法糖,面向对象取决于是否用封装、继承、多态组织代码;实例属性须在constructor中初始化,方法挂载原型,私有字段用#,多态依赖鸭子类型而非类型系统。

JavaScript 本身没有 class 关键字的年代就支持面向对象,现在有了 class 也只是语法糖——真正决定是否“面向对象”的,是你是否在用封装、继承、多态的思路组织代码,而不是有没有 newextends

class 声明构造逻辑,但别把它当 Java 类用

class 在 JavaScript 中不创建类型系统,它只是 function 的包装。实例的原型链依然指向 MyClass.prototype,所有方法都挂载在原型上,而非每个实例独有一份。

实操建议:

  • 把实例属性写在 constructor 内(如 this.name = name),否则容易误以为是“类字段”而漏初始化
  • 避免在 class 中直接写 function 表达式作为方法(如 method = () => {}),这会破坏原型链,且无法被子类 super.method() 正确调用
  • 静态方法用 static,但它不能访问 this 实例,只适合工具逻辑(如 User.createAdmin()
class User {
  constructor(name) {
    this.name = name; // ✅ 实例属性必须在这里赋值
  }
  greet() {
    return `Hello, ${this.name}`;
  }
  static isUser(obj) {
    return obj instanceof User;
  }
}

继承要小心 super() 调用时机和 this 绑定

子类构造函数中,必须在使用 this 前调用 super();否则会报 ReferenceError: Must call super constructor in derived class before accessing 'this'

常见错误现象:

  • 忘记 super() → 直接报错退出

  • super() 放在 this 之后 → 同样报错
  • 用箭头函数重写父类方法 → this 指向外层作用域,不是当前实例

实操建议:

  • 子类 constructor 第一行就写 super(...args)
  • 想复用父类逻辑,用 super.methodName(),不要手动绑定 Parent.prototype.methodName.call(this)
  • 如果需要修改父类方法行为,优先用 super 调用再处理,而不是完全覆盖

“私有”不是靠命名约定,而是靠 # 字段或闭包

下划线前缀(如 _id)只是提示,无法阻止外部读写。# 开头的字段才是真私有:语法强制不可访问,且不会出现在 for...inObject.keys()JSON.stringify() 中。

实操建议:

  • # 字段存敏感状态(如 #token#balance),它比 Symbol 或闭包更简洁、可读性更高
  • 私有字段必须在 constructor 或字段声明处初始化(class A { #x = 0; }),不能动态添加
  • 若需兼容旧环境(如 IE 或 Node.js this 的方法
class BankAccount {
  #balance = 0;
  constructor(initial) {
    this.#balance = initial;
  }
  deposit(amount) {
    this.#balance += amount; // ✅ 可访问
  }
  getBalance() {
    return this.#balance; // ✅ 可返回
  }
}
// new BankAccount(100).#balance // ❌ SyntaxError

多态靠运行时判定,不是类型声明

JavaScript 没有接口或抽象类语法,所谓“多态”就是:同一段代码(如 draw(shape))能接受不同结构的对象,并根据其实际方法存在与否或返回值做分支处理。

实操建议:

  • 优先用“鸭子类型”:检查对象是否有某方法(if ('render' in obj && typeof obj.render === 'function')),而不是 instanceof
  • 避免深度依赖继承链实现多态;组合(class Button { constructor(renderer) { this.renderer = renderer; } )往往比继承更灵活
  • 用 TypeScript 的 interface 或 JSDoc 的 @typedef 做契约提示,但别当成运行时保障

真正难的不是写出 class,而是判断什么时候不该用 class——比如配置对象、纯数据容器、一次性的策略函数,用字面量或函数更轻量。


# javascript  # java  # js  # node.js  # json  # node  # typescript  # access  # 工具 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel distinct去重查询_Laravel Eloquent去重方法  如何在服务器上三步完成建站并提升流量?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Swift开发中switch语句值绑定模式  如何在腾讯云服务器快速搭建个人网站?  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  Python进程池调度策略_任务分发说明【指导】  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  LinuxCD持续部署教程_自动发布与回滚机制  如何在阿里云香港服务器快速搭建网站?  浅谈javascript alert和confirm的美化  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  Laravel如何实现API版本控制_Laravel版本化API设计方案  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  如何快速搭建高效服务器建站系统?  如何注册花生壳免费域名并搭建个人网站?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  网站制作价目表怎么做,珍爱网婚介费用多少?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  如何快速搭建高效WAP手机网站?  如何基于云服务器快速搭建个人网站?  详解jQuery停止动画——stop()方法的使用  如何在万网ECS上快速搭建专属网站?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Laravel如何发送系统通知?(Notification渠道示例)  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  企业网站制作这些问题要关注  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  详解Oracle修改字段类型方法总结  简单实现jsp分页  如何在万网主机上快速搭建网站?  如何实现建站之星域名转发设置?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  如何在 Pandas 中基于一列条件计算另一列的分组均值  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  手机软键盘弹出时影响布局的解决方法  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel如何实现API资源集合?(Resource Collection教程)  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】