如何用javascript实现面向对象编程【教程】
发布时间 - 2026-01-25 00:00:00 点击率:次JavaScript的class只是语法糖,面向对象取决于是否用封装、继承、多态组织代码;实例属性须在constructor中初始化,方法挂载原型,私有字段用#,多态依赖鸭子类型而非类型系统。
JavaScript 本身没有 class 关键字的年代就支持面向对象,现在有了 class 也只是语法糖——真正决定是否“面向对象”的,是你是否在用封装、继承、多态的思路组织代码,而不是有没有 new 或 extends。
用 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...in、Object.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提速下载【修复】
上一篇:vscode 云更改是什么
上一篇:vscode 云更改是什么


