什么是javascript原型链机制_它怎样实现对象间的继承关系

发布时间 - 2026-01-09 00:00:00    点击率:
JavaScript原型链是对象通过__proto__直接链接另一对象并沿链委托查找属性和方法的机制,不复制、无父类声明,仅有一条动态可变的查找路径。

JavaScript 原型链不是“模拟继承”,而是**对象直接通过 __proto__ 链接另一个对象,查找属性和方法时沿链向上委托**。它不复制,不声明“父类”,只有一条动态可变的查找路径。

原型链怎么形成:从 __proto__prototype 的关系说起

每个函数(包括构造函数)都有一个 prototype 属性,指向一个对象;每个由该函数创建的实例,其内部 __proto__ 会自动指向该函数的 prototype。这就是链的起点。

关键点:

  • __proto__ 是实例身上的内部引用(非标准但普遍支持),prototype 是函数才有的显式属性
  • Object.prototype.__proto__null,这是原型链终点
  • Function.prototype.__proto__ === Object.prototype,说明函数也是对象
function Animal(name) {
  this.name = name;
}
Animal.prototype.speak = function() {
  console.log(this.name + ' makes a sound');
};

const dog = new Animal('Dog');
console.log(dog.__proto__ === Animal.prototype); // true
console.log(Animal.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__); // null

继承如何发生:属性查找就是原型链遍历

当你访问 dog.speak(),JS 引擎按顺序检查:dog 自身 → dog.__proto__(即 Animal.prototype)→ Animal.prototype.__proto__(即 Object.prototype)→ 最终到 null。找到第一个匹配就停止。

常见误解与陷阱:

  • 修改 Animal.prototype 会影响所有已有和未来的 Animal 实例(因为共用同一对象)
  • dog.speak = ... 会遮蔽原型上的同名方法,后续调用走实例自身,不触发委托
  • 箭头函数没有 prototype,不能用作构造函数,也不参与原型链构建

实现“子类”继承:手动设置 __proto__ 或用 Object.setPrototypeOf()

ES6 class 是语法糖,底层仍靠原型链。手动模拟继承时,关键是让子构造函数的原型对象的 __proto__ 指向父构造函数的原型对象。

function Animal(name) { this.name = name; }
Animal.prototype.eat = function() { console.log('eating'); };

function Dog(name, breed) {
  Animal.call(this, name); // 继承实例属性
  this.breed = breed;
}

// 关键一步:建立原型链
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // 修复 constructor 指向

Dog.prototype.bark = function() { console.log('Woof!'); };

const myDog = new Dog('Max', 'Golden');
myDog.eat(); // ✅ 来自 Animal.prototype
myDog.bark(); // ✅ 来自 Dog.prototype

注意:Object.create(Animal.prototype) 比直接赋值 Dog.prototype = Animal.prototype 安全,后者会让子类修改影响父类原型。

现代写法里原型链还在吗:classextendssuper 的本质

是的,完全依赖原型链。extends 会自动设置子类 prototype.__proto__ 指向父类 prototype,并确保子类 constructor 正确继承父类静态方法(通过 SubClass.__proto__ === SuperClass)。

容易忽略的细节:

  • super() 在子类构造器中必须调用,否则无法初始化 this —— 这是因为子类构造器默认不绑定 this,需由父类构造器完成
  • static 方法不进入原型链,它们存在于构造函数自身上,通过 __proto__ 链继承(如 Dog.__proto__ === Animal
  • instanceof 判断基于原型链:检查右操作数的 prototype 是否在左操作数的原型链上

原型链机制本身简单,但组合 newcallObject.createclass 后,哪一层该改什么、谁引用谁,稍不注意就会断链或污染共享原型。调试时优先查 obj.__proto__Constructor.prototype 是否对得上,比看代码逻辑更快定位问题。


# javascript  # es6  # java  # js  # go  # speak 


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


相关推荐: 在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何彻底卸载建站之星软件?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Android利用动画实现背景逐渐变暗  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  浅析上传头像示例及其注意事项  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Laravel如何使用withoutEvents方法临时禁用模型事件  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Laravel如何实现模型的全局作用域?(Global Scope示例)  如何在服务器上配置二级域名建站?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  如何确保FTP站点访问权限与数据传输安全?  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  如何在阿里云虚拟主机上快速搭建个人网站?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel如何实现多对多模型关联?(Eloquent教程)  Laravel如何处理表单验证?(Requests代码示例)  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Python结构化数据采集_字段抽取解析【教程】  历史网站制作软件,华为如何找回被删除的网站?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Laravel如何配置Horizon来管理队列?(安装和使用)  如何用PHP工具快速搭建高效网站?  Bootstrap CSS布局之列表  如何在VPS电脑上快速搭建网站?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  如何构建满足综合性能需求的优质建站方案?  javascript中闭包概念与用法深入理解  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  大型企业网站制作流程,做网站需要注册公司吗?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  如何在阿里云虚拟服务器快速搭建网站?  如何在IIS中新建站点并配置端口与物理路径?  西安专业网站制作公司有哪些,陕西省建行官方网站?