什么是原型链_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; ?>

相关推荐

在线咨询

点击这里给我发消息QQ客服

在线咨询

免费通话

24h咨询:4006964355


如您有问题,可以咨询我们的24H咨询电话!

免费通话

微信扫一扫

微信联系
返回顶部