什么是原型链_JavaScript如何实现继承【教程】
技术百科
夢幻星辰
发布时间:2026-01-28
浏览: 次 JavaScript继承基于[[Prototype]]链,class仅为语法糖;new操作自动设置实例的__proto__指向构造函数prototype;Object.create可手动模拟原型链,但需注意constructor修复与赋值行为。
JavaScript 的继承不是靠 class 关键字“实现”的,而是靠对象内部的 [[Prototype]] 链天然运作的;class 只是语法糖,背后全是原型链在干活。
为什么 new 一个函数会得到有 __proto__ 的对象
每次调用 new Fn(),JS 引擎会自动做三件事:创建空对象、把该对象的 [[Prototype]] 指向 Fn.prototype、再把 this 绑给这个对象并执行构造函数。所以结果对象的 __proto__ 就等于 Fn.prototype。
-
__proto__是每个对象都有的内部链接(非标准但广泛支持),指向它的原型对象 -
Fn.prototype是函数独有的属性,初始是一个普通对象,带一个constructor指回Fn - 修改
Fn.prototype上的属性或方法,所有通过new Fn()创建的实例都能立即访问到
Object.create(null) 和 Object.create(Fn.prototype) 的区别

前者创建的是“无原型”的对象,__proto__ 为 null,不继承任何东西;后者创建的对象,其 __proto__ 直接指向 Fn.prototype,是手动模拟 new 的关键步骤。
- 用
Object.create(Fn.prototype)构建子类原型时,必须显式设置constructor,否则child.prototype.constructor会指向父类 - 不推荐直接改
__proto__,它性能差且不可靠;Object.setPrototypeOf()是标准替代,但依然应避免频繁使用 -
Object.create(null)常用于造哈希表或配置对象,避免意外继承toString等方法引发冲突
class extends 底层还是走 prototype 链吗
是的。Babel 编译或 V8 执行 class A extends B 时,本质仍是设置 A.prototype.__proto__ === B.prototype,同时确保 A.__proto__ === B(静态方法可继承)。super() 调用的也是 B 构造函数。
立即学习“Java免费学习笔记(深入)”;
- 子类
constructor中必须调用super(),否则无法初始化this—— 这是因为子类的this依赖父类构造逻辑来绑定原型链 -
extends null是合法的,此时子类原型链终点是null,不继承Object.prototype上的方法 - 箭头函数没有
prototype,不能被new,也不能作为extends的右值
真正容易被忽略的,是原型链上属性查找只发生在读取时,而赋值永远写在当前对象自身;很多人以为 obj.x = 1 会修改原型上的 x,其实只是在 obj 上新增了一个自有属性。
# js
# javascript
# java
# class
# 区别
# 子类
# 构造函数
# 为什么
# NULL
# 继承
# Object
# 父类
相关栏目:
<?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; ?>
】
相关推荐
- Win11怎么设置任务栏对齐方式_Windows1
- Win11文件扩展名怎么显示_Win11查看文件后
- Windows10如何删除Windows.old_
- c++中explicit(bool)的用法 c++
- php怎么下载安装后测试是否成功_简单脚本验证方法
- Win11怎么关闭任务栏小组件_Windows11
- Drupal 中渲染节点时出现 HTML 标签嵌套
- Windows的便笺功能如何使用?(桌面备忘技巧)
- Win11怎么设置桌面图标间距_Windows11
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- Win11怎么忘记WiFi网络_Win11删除已保
- Win11怎么设置右键刷新选项_Windows11
- 如何在Golang中实现微服务服务拆分_Golan
- php8.4如何实现队列任务_php8.4redi
- Windows笔记本无法进入睡眠模式怎么办?(电源
- php怎么连接数据库_MySQL数据库连接的基础代
- 如何使用Golang编写单元测试_创建Test函数
- php怎么捕获异常_trycatch结构处理运行时
- c++ std::atomic如何保证原子性 c+
- c++的static关键字有什么用 静态变量和静态
- 如何使用Golang实现容器安全扫描_Golang
- 如何在Golang中写入XML文件_生成符合规范的
- 如何在Golang中验证模块完整性_Golangg
- Windows10如何查看蓝屏日志_Win10使用
- php错误怎么开启_display_errors与
- 本地php环境打开php文件直接下载_浏览器解析p
- Windows服务无法启动错误1067是什么_进程
- 如何解决Windows时间不准的问题?(自动同步设
- 电脑的“网络和共享中心”去哪了_Windows 1
- Win10怎么限制单程序CPU占用上限_Win10
- 如何诊断并终止卡死的 multiprocessin
- Python数据挖掘核心算法实践_聚类分类与特征工
- php在Linux怎么部署_LNMP环境搭建PHP
- c++ atoi和atof函数用法_c++字符数组
- Win11怎么打开旧版计算器_Win11恢复传统计
- Windows10系统怎么查看运行时间_Win10
- Win10如何更改电脑休眠时间_Windows10
- php订单日志怎么在swoole写_php协程sw
- Windows蓝屏BAD_POOL_HEADER故
- Win11怎么更改计算机名_Windows11系统
- Linux如何挂载新硬盘_Linux磁盘分区格式化
- MAC怎么截图并快速编辑_MAC自带截图快捷键与标
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- Mac的Time Machine怎么用_Mac系统
- Python函数接口稳定性_版本演进解析【指导】
- c++怎么编写动态链接库dll_c++ __dec
- c++如何打印函数堆栈信息_c++ backtra
- 如何在 Go 中判断变量是否为函数类型
- php8.4新语法match怎么用_php8.4m
- Go语言中CookieJar的持久化机制解析:内存

QQ客服