信息发布→ 登录 注册 退出

JS原型链继承_面向对象编程实战指南

发布时间:2025-11-16

点击量:
J*aScript通过原型链实现继承,对象的[[Prototype]]指向原型,共享属性方法。函数的prototype用于构造实例,子类可通过Object.create()继承父类原型,结合构造函数借用实现组合继承。ES6引入class和extends语法,使继承更直观,但底层仍基于原型链。掌握原型链是理解JS面向对象的核心。

js原型链继承_面向对象编程实战指南

J*aScript 中的原型链继承是实现面向对象编程的核心机制之一。它不同于传统基于类的语言(如 J*a 或 C++),而是通过对象之间的链接关系来实现方法和属性的共享与继承。理解原型链,是掌握 JS 面向对象的关键一步。

原型与原型链的基本概念

在 J*aScript 中,每个对象都有一个内部属性 [[Prototype]],指向其原型对象。这个原型对象可以包含可被继承的方法和属性。现代浏览器中通常可通过 __proto__ 访问,但更推荐使用 Object.getPrototypeOf() 方法。

函数除了有 [[Prototype]] 外,还拥有一个 prototype 属性,该属性仅在函数作为构造函数时使用。当用 new 调用构造函数创建实例时,实例的 [[Prototype]] 会指向构造函数的 prototype 对象。

示例:

function Person(name) {
  this.name = name;
}

Person.prototype.greet = function() {
  console.log("Hello, I'm " + this.name);
};

const john = new Person("John");
john.greet(); // 输出: Hello, I'm John

这里 john 的 __proto__ 指向 Person.prototype,从而可以访问 greet 方法。

实现继承:原型链继承方式

最基础的继承方式是将子类的 prototype 设置为父类的一个实例,使子类实例能沿着原型链访问父类的属性和方法。

经典写法:

function Animal(voice) {
  this.voice = voice;
}

Animal.prototype.speak = function() {
  console.log(this.voice);
};

function Dog(name) {
  Animal.call(this, "Woof!"); // 借用构造函数,继承实例属性
  this.name = name;
}

Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // 修正构造器指向

const dog = new Dog("Buddy");
dog.speak(); // 输出: Woof!

关键点:

  • Object.create(Animal.prototype) 创建一个以 Animal.prototype 为原型的新对象,避免直接赋值带来的副作用。
  • Animal.call(this, ...) 确保父类构造函数在子类实例上下文中执行,继承实例自身属性。
  • 手动恢复 constructor 指向,防止后续逻辑出错。

组合继承的优化:寄生组合式继承

上面的方式虽然可行,但会调用两次父类构造函数。更优方案是使用寄生组合式继承,避免重复调用。

Visla Visla

AI视频生成器,快速轻松地将您的想法转化为视觉上令人惊叹的视频。

Visla 100 查看详情 Visla

实际开发中,可以通过封装一个 inherit 函数来简化过程:

function inherit(subType, superType) {
  const prototype = Object.create(superType.prototype);
  prototype.constructor = subType;
  subType.prototype = prototype;
}

使用方式不变,但更加高效和清晰。

ES6 类语法:更直观的写法

ES6 引入了 classextends 关键字,让继承写法更接近传统语言,底层仍基于原型链。

class Animal {
  constructor(voice) {
    this.voice = voice;
  }
  speak() {
    console.log(this.voice);
  }
}

class Dog extends Animal {
  constructor(name) {
    super("Woof!");
    this.name = name;
  }
}

const dog = new Dog("Buddy");
dog.speak(); // 输出: Woof!

这种写法语义清晰,推荐在现代项目中使用。

基本上就这些。掌握原型链继承的本质,无论使用原生方式还是 class 语法,都能写出结构良好的面向对象代码。

以上就是JS原型链继承_面向对象编程实战指南的详细内容,更多请关注其它相关文章!


相关文章: sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  快手官方唯一登录入口 谨防山寨钓鱼网站  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  outlook中文官网入口地址 outlook官方中文版直达首页链接  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  AO3官方在线访问地址 Archive of Our Own最新镜像合集  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  126邮箱账号注册 电脑版登录入口  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  J*a中实现Go语言select通道多路复用机制  J*a递归快速排序中静态变量导致数据累积问题的解决方案  微博网页版首页入口 微博电脑端官网登录链接  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力  自定义Bag-of-Words实现:处理带负号的词汇权重  Composer的 COMPOSER_PROCESS_TIMEOUT 配置项有什么用_解决因执行时间过长而失败的Composer脚本  快手极速版在线观看 官方网页版登录地址  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  Python类型检查:优化关联可选属性的Mypy推断策略  Composer如何解决json扩展缺失的错误  html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  Spring Boot嵌入式服务器与J*a EE:功能支持深度解析  J*aScript动态修改指定div内所有a标签样式指南  poki网页游戏推荐_poki免费游戏平台入口  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  b站如何看历史记录_b站观看历史找回方法  在PHP脚本中通过SSHFS挂载远程文件系统的最佳实践与常见问题解决  poki免费入口快捷访问 poki人气小游戏直接玩站点  文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】  海棠电脑版入口_通过电脑访问海棠官网阅读  J*a实现学校排课程序_面向对象结构化项目示例  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  如何在Promise链中优雅地中断后续then执行  解决Bootstrap卡片顶部边距导致背景图下移的问题  c++如何实现单例设计模式_c++线程安全的单例模式写法  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  uc浏览器网页版入口 uc浏览器网页版最新网址  BetterDiscord插件中安全更新用户简介的实践指南  使用PHP DOM解析器高效提取HTML中特定标题及其紧邻段落 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!