什么是javascript类_如何使用ES6类进行面向对象编程【教程】

发布时间 - 2026-02-02 00:00:00    点击率:
ES6 class是构造函数语法糖,受TDZ限制不可提升;constructor中return对象会覆盖实例;继承内置类须调用super;错误提示本质是原型机制问题。

ES6 的 class 不是新对象模型,只是构造函数的语法糖;直接用它写业务没问题,但想搞懂继承、new 行为或调试原型链时,绕不开背后的函数和 prototype

为什么 class 声明不能被提升?

因为 class 声明会进入「暂时性死区」(TDZ),和 let/const 一样:在声明前访问会抛出 ReferenceError,而不是 undefined

  • Foo() 调用放在 class Foo { ... } 前 → 报错 ReferenceError: Cannot access 'Foo' before initialization
  • function Foo() {} 可以被提升,调用不会报错
  • 如果必须动态加载类,改用 const Foo = class { ... }(类表达式),它可赋值、可传参、不受 TDZ 限制

constructor 里不写 return 就一定返回实例吗?

不一定。显式 return 一个**对象**时,new 表达式会忽略默认实例,直接返回你 return 的那个对象;返回原始值(stringnumbernull 等)则被忽略,仍返回实例。

class A {
  constructor() {
    return { x: 1 }; // new A() 得到的是 { x: 1 },不是 A 的实例
  }
}
console.log(new A() instanceof A); // false
  • 这个行为常被用于实现「单例包装」或「代理构造」,但容易误用导致 instanceof 失效
  • 多数场景下别 return 对象,除非你明确需要覆盖实例创建逻辑

如何正确扩展内置类(比如 ArrayError)?

直接 extends Array 是合法的,但要注意:子类构造函数中必须先调用 super(...args),且不能跳过它去手动 return 数组实例 —— 否则长度、索引等内部状态会异常。

class MyArray extends Array {
  constructor(...args) {
    super(...args); // 必须!否则 length 不更新、push 不生效
  }
  first() { return this[0]; }
}
  • extends Error 同理:必须 super(message),否则堆栈信息丢失(err.stack 为空)
  • V8 引擎对内置类子类化有特殊处理,但 Safari 旧版存在兼容问题,生产环境建议加运行时检测
  • 不要试图用 class X extends null 模拟「无原型对象」——这会报错,应改用 Object.create(null)

真正麻烦的不是怎么写 class,而是当遇到 TypeError: Class constructor X cannot be invoked without 'new' 或子类方法拿不到父类私有字段时,得立刻意识到:你在跟 JavaScript 的原型机制和执行上下文较劲,而不是语法本身。


# javascript  # es6  # java  # access  # safari  #   # 面向对象编程  # 为什么  # String  # Array  # Object  # NULL  # 面向对象  # 父类  # 子类  # 构造函数  # Error  # const  # 继承  #   # class  # number  # undefined  # function  # 对象  # constructor  # prototype 


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


相关推荐: 如何快速登录WAP自助建站平台?  如何做网站制作流程,*游戏网站怎么搭建?  微信公众帐号开发教程之图文消息全攻略  如何在云主机上快速搭建多站点网站?  做企业网站制作流程,企业网站制作基本流程有哪些?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  简单实现Android文件上传  Laravel如何处理异常和错误?(Handler示例)  如何挑选高效建站主机与优质域名?  Laravel如何为API生成Swagger或OpenAPI文档  深圳网站制作平台,深圳市做网站好的公司有哪些?  QQ浏览器网页版登录入口 个人中心在线进入  如何快速搭建高效可靠的建站解决方案?  SQL查询语句优化的实用方法总结  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  潮流网站制作头像软件下载,适合母子的网名有哪些?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  香港服务器选型指南:免备案配置与高效建站方案解析  什么是javascript作用域_全局和局部作用域有什么区别?  利用python获取某年中每个月的第一天和最后一天  lovemo网页版地址 lovemo官网手机登录  如何快速搭建支持数据库操作的智能建站平台?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  免费网站制作appp,免费制作app哪个平台好?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Android利用动画实现背景逐渐变暗  HTML 中动态设置元素 name 属性的正确语法详解  深圳网站制作的公司有哪些,dido官方网站?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel集合Collection怎么用_Laravel集合常用函数详解  装修招标网站设计制作流程,装修招标流程?  Laravel如何处理表单验证?(Requests代码示例)  微信小程序 五星评分(包括半颗星评分)实例代码  大型企业网站制作流程,做网站需要注册公司吗?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Android自定义控件实现温度旋转按钮效果  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  如何在Ubuntu系统下快速搭建WordPress个人网站?  Laravel如何使用Blade模板引擎?(完整语法和示例)  如何在新浪SAE免费搭建个人博客?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  如何在阿里云通过域名搭建网站?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel如何创建自定义Facades?(详细步骤)