javascript如何实现继承_有哪些方法可以创建子类【教程】
技术百科
幻影之瞳
发布时间:2026-01-28
浏览: 次 JavaScript中class继承必须用extends和super(),子类需显式继承单个父类并在构造函数中先调用super()再访问this;多重继承不支持,漏调或错序super()会抛ReferenceError。
JavaScript 中 class 继承必须用 extends 和 super()
ES6 的 class 语法不支持多重继承,子类必须显式继承一个父类,并在构造函数中调用 super()——否则会报 ReferenceError: Must call super constructor in derived class before accessing 'this'。

super(),或在调用前访问 this(比如先写 console.log(this) 再写 super()),这都会直接抛错。
-
extends后只能跟一个构造函数或null(极少见) -
super()必须在使用this前调用,且仅限于子类构造函数内 - 若父类构造函数需要参数,
super(...args)必须传对应参数
原型链继承:手动改 Child.prototype.__proto__ 或用 Object.setPrototypeOf()
这是最底层的继承方式,绕过 class 语法,直接操作原型。适合需要动态继承、或兼容老环境(如 IE11)的场景,但易出错且可读性差。
不要直接赋值 Child.prototype = Parent.prototype——这会让子类和父类共享同一原型对象,修改子类原型会影响父类。
- 推荐写法:
Object.setPrototypeOf(Child.prototype, Parent.prototype) - 构造函数内部仍需手动调用
Parent.call(this, ...)实现实例属性继承 - 注意:V8 引擎对
Object.setPrototypeOf()有性能警告,频繁调用会影响优化
组合继承(构造函数 + 原型链)仍是兼容性最强的通用方案
它同时解决实例属性继承(靠 Parent.call(this))和方法复用(靠原型链),没有寄生组合继承的额外函数开销,也没有 ES6 class 的语法限制。
典型结构是:子类构造函数里执行一次 Parent.call(this, ...);再用 Object.setPrototypeOf() 或 Child.prototype = Object.create(Parent.prototype) 设置原型关系。
- 避免在子类原型上直接写
constructor属性,否则会丢失原始构造器引用 - 如果用
Object.create(Parent.prototype),记得补上Child.prototype.constructor = Child - 该模式在 Node.js 早期版本、微信小程序基础库 2.0+、React Native 等环境中稳定可用
不推荐用 Object.create(null) 做继承起点
虽然 Object.create(null) 创建的对象没有 toString、hasOwnProperty 等默认方法,看起来“干净”,但它也切断了所有原型链,导致无法被 instanceof 正确识别,也无法被大多数工具(如 JSON.stringify、Lodash 的 isPlainObject)正常处理。
即使你只是想避免污染,也应优先考虑 Object.create(Parent.prototype) 或标准 class 继承。
-
obj instanceof Parent对Object.create(null)实例永远返回false -
for...in遍历时不会报错,但完全遍历不到任何继承方法 - 现代框架(如 Vue 3 的响应式系统)明确要求对象必须有原型链才能代理
class + extends;需要兼容旧环境或特殊控制时,才回到组合继承。别为了“看起来高级”而用 Object.create(null) 或反复重写 __proto__——那只会让调试变慢、协作变难。
# 微信
# js
# json
# javascript
# java
# class
# 子类
# 构造函数
# node
# NULL
# 继承
# Object
# for
# node.js
# 父类
# 微信小程序
# react
# es6
# vue
# 多重继承
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Windows如何拦截2345弹窗广告_Windo
- Win11怎么关闭自动修复_跳过Win11开机自动
- Django 测试数据库表缺失与字段未创建问题的完
- 如何在 Django 中安全修改用户密码而不使会话
- Django 密码修改后会话失效的解决方案
- Win11怎么设置桌面图标间距_Windows11
- Windows 10怎么录屏_Windows 10
- php485函数怎么捕获异常_php485错误处理
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- Win11怎么关闭触摸屏_禁用Win11笔记本触摸
- Mac怎么设置登录项_Mac管理开机自启动程序【教
- Win11怎么查看wifi信号强度_检测Windo
- Windows系统时间服务错误_W32Time服务
- Mac如何解压zip和rar文件?(推荐免费工具)
- Win11怎么关闭自动更新 Win11永久关闭系统
- Go 语言标准库为何不提供泛型 Contains
- C++友元类使用场景_C++类间协作设计方式讲解
- php485支持哪些操作系统_php485跨系统支
- 如何在 VS Code 中正确配置并使用 NumP
- Win11如何开启telnet服务 Win11启用
- 如何使用Golang开发简单的聊天室消息存储_Go
- Win11如何设置ipv6 Win11开启IPv6
- Win11怎么设置单手模式_Win11触控键盘布局
- Win11如何设置开机自动联网 Win11宽带连接
- MySQL 中使用 IF 和 CASE 实现查询字
- c++输入输出流 c++ cin与cout格式化输
- php能跑在stm32上吗_php在stm32微控
- windows系统如何安装cab更新补丁_wind
- PHP的FastAdmin架构适合二次开发吗_特点
- 为什么本地php环境运行php脚本卡顿_php执行
- Win11怎么关闭开机声音_Win11系统启动提示
- Win11怎么修改DNS服务器 Win11设置DN
- C#如何使用XPathNavigator高效查询X
- 如何在Golang中捕获结构体方法错误_Golan
- php修改数据怎么改富文本_update更新htm
- Mac自带的词典App怎么用_Mac添加和使用多语
- PHP 中 require() 语句返回值的用法详
- Win11 C盘满了怎么清理 Win11磁盘清理和
- c++中如何求一个数的平方根_c++ sqrt函数
- Linux怎么查找死循环进程_Linux系统负载分
- Python随机数生成_random模块说明【指导
- 如何使用Golang实现容器自动化运维_Golan
- Win11怎么设置任务栏对齐方式_Windows1
- 如何用::实现单例模式_php静态方法与作用域操作
- Windows10如何更改任务栏高度_Win10解
- MAC怎么截图并快速编辑_MAC自带截图快捷键与标
- Win11如何更改任务栏颜色 Win11自定义任务
- c++如何实现多态性_c++ 虚函数表原理与动态绑
- 如何在Golang中实现微服务服务拆分_Golan
- Go 中实现 Python urllib.quot

QQ客服