从0开始学习JavaScript--JavaScript中的对象原型

news2024/11/27 18:36:54

JavaScript中的对象原型是理解该语言核心概念的关键之一。本文将深入探讨JavaScript对象原型的作用、使用方法以及与继承相关的重要概念。通过详细的示例代码和全面的讲解,将能够更好地理解和运用JavaScript对象原型,提高代码的可维护性和扩展性。

JavaScript中的原型

在JavaScript中,几乎所有的对象都是由一个原型对象衍生而来的。原型链是连接这些对象的重要机制,它使得对象之间可以共享属性和方法。这里将介绍如何使用原型创建对象,并深入探讨原型链的工作原理。

// 使用原型创建对象
function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
};

const john = new Person('John', 25);
john.sayHello();

原型链与继承

原型链是JavaScript中实现继承的基础。这里将详细讲解原型链的构建过程,以及如何实现对象之间的继承关系。

// 继承示例
function Student(name, age, grade) {
  // 调用父类构造函数
  Person.call(this, name, age);
  this.grade = grade;
}

// 设置原型链,实现继承
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

// 新的方法
Student.prototype.study = function() {
  console.log(`${this.name} is studying in grade ${this.grade}.`);
};

const alice = new Student('Alice', 18, 12);
alice.sayHello();
alice.study();

对象原型的动态性

JavaScript中的对象原型是动态的,可以在运行时修改。这里将讨论如何动态地添加、删除和修改原型的属性和方法,以及这对对象实例的影响。

// 动态修改原型
Person.prototype.sayGoodbye = function() {
  console.log(`Goodbye from ${this.name}!`);
};

john.sayGoodbye();

// 动态添加原型属性
Person.prototype.address = '123 Main St';
console.log(alice.address);

// 动态删除原型方法
delete Person.prototype.sayHello;
// 下一行将抛出错误,因为sayHello方法已被删除
// john.sayHello();

原型与ES6中的类

ES6引入了类的概念,但实际上它仍然基于原型。这里将比较使用原型和使用类创建对象的方法,并探讨它们之间的联系。

// 使用ES6类
class Animal {
  constructor(name) {
    this.name = name;
  }

  makeSound() {
    console.log('Some generic sound');
  }
}

// 继承
class Dog extends Animal {
  makeSound() {
    console.log('Woof! Woof!');
  }
}

const dog = new Dog('Buddy');
dog.makeSound();

对象原型的高级应用

除了基础的对象原型使用外,JavaScript还提供了一些高级特性,如Object.create()Object.setPrototypeOf()方法。这些方法能够更灵活地操作对象原型。

// 使用Object.create()创建对象并指定原型
const carPrototype = {
  startEngine() {
    console.log('Engine started.');
  },
  stopEngine() {
    console.log('Engine stopped.');
  }
};

const myCar = Object.create(carPrototype);
myCar.startEngine();

// 使用Object.setPrototypeOf()动态修改原型
const bike = {
  pedal() {
    console.log('Pedaling...');
  }
};

Object.setPrototypeOf(myCar, bike);
myCar.pedal();

内置对象的原型

JavaScript中的内置对象,如Array、String、Number等,也拥有原型。这里将深入研究这些内置对象的原型方法,以及如何通过原型链访问它们。

// Array原型方法示例
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(num => num * 2);
console.log(doubled);

// String原型方法示例
const greeting = 'Hello, World!';
const upperCaseGreeting = greeting.toUpperCase();
console.log(upperCaseGreeting);

避免原型污染

在使用原型时,需要注意避免原型污染问题。原型污染可能导致意外的行为,因此需要谨慎处理。

// 避免原型污染
Object.prototype.badIdea = 'Avoid me!';
const newObj = {};
console.log(newObj.badIdea); // 输出'Avoid me!'

// 避免方法
for (const key in newObj) {
  if (newObj.hasOwnProperty(key)) {
    console.log(key); // 不会输出'badIdea'
  }
}

对象原型的性能考虑

在大型应用中,原型链的深度可能影响性能。这里将讨论如何通过合理设计对象原型链来提高应用的执行效率。

// 减少原型链深度
function OptimizedObject() {
  this.property1 = 'Value 1';
  this.property2 = 'Value 2';
  // 更多属性...
}

// 避免深层嵌套
OptimizedObject.prototype.method1 = function() {
  console.log('Method 1');
};

// 更多方法...

总结

在本文中,深入探讨了JavaScript对象原型的多个关键方面,从基础概念到高级应用,以及性能考虑。了解了如何使用原型创建对象、构建原型链和实现继承,通过大量的示例代码演示了这些概念在实际编码中的应用。

重点介绍了原型链与ES6类的关系,让大家能够更好地理解JavaScript中的继承机制。还探讨了动态性,演示了如何在运行时动态修改原型,以及这对对象实例的影响。

在高级应用部分,学习了Object.create()Object.setPrototypeOf()等方法,能够更灵活地操作对象原型。同时,深入了解了内置对象的原型方法,如Array和String的一系列实用方法。

特别强调了避免原型污染的重要性,通过示例代码演示了如何防止不需要的属性被添加到所有对象的原型链中,从而确保代码的可维护性。最后,关注了对象原型的性能考虑,提供了一些建议,帮助大家在设计对象原型链时更加注重性能。

通过对JavaScript对象原型全面而深入的讲解,希望大家能够运用这一核心概念,提高代码的质量和可维护性。这些知识将在实际项目中发挥巨大作用,为构建高效、可扩展的JavaScript应用奠定坚实基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1257140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows下docker环境搭建与运行实战

背景 学习docker使用,需要环境,今天主要的目标是在windows环境下安装docker环境。 为什么要这么搞,主要是企业内部服务器,都是跟公网隔离的,没有访问公网权限,所以镜像什么的,从公网拉取完全没…

31 - MySQL调优之SQL语句:如何写出高性能SQL语句?

从今天开始,我将带你一起学习 MySQL 的性能调优。MySQL 数据库是互联网公司使用最为频繁的数据库之一,不仅仅因为它开源免费,MySQL 卓越的性能、稳定的服务以及活跃的社区都成就了它的核心竞争力。 我们知道,应用服务与数据库的交…

C语言:写一个函数,实现3*3矩阵的转置(指针)

分析: 在主函数 main 中,定义一个 3x3 的整型数组 a,并定义一个指向整型数组的指针 p。然后通过循环结构和 scanf 函数,从标准输入中读取用户输入的 3x3 矩阵的值,并存储到数组 a 中。 接下来,调用 mov…

MySQL的undo log 与MVCC

文章目录 概要一、undo日志1.undo日志的作用2.undo日志的格式3. 事务id(trx_id) 二、MVCC1.版本链2.ReadView3.REPEATABLE READ —— 在第一次读取数据时生成一个ReadView4.快照读与当前读 小结 概要 Undo Log:数据库事务开始之前&#xff0…

构建SQL Server链接服务器:实现跨服务器数据访问及整合

点击上方蓝字关注我 在SQL Server数据库管理中,链接服务器是一项强大的功能,允许在一个SQL Server实例中访问另一个SQL Server实例的数据。这种功能为数据库管理员提供了灵活性,使其能够跨不同服务器进行数据交互,开辟了更多的应用…

realname,soname和linkname

背景 当在看/lib下的一些文件时候,我们发现几乎都是三个动态库文件,为啥? 分析 当我发布一个动态库的时候,比如版本是maj.min.patch(10.2.1)的格式,当我改了小版本的号的时候(10…

牛客网刷题笔记四 链表节点k个一组翻转

NC50 链表中的节点每k个一组翻转 题目: 思路: 这种题目比较习惯现在草稿本涂涂画画链表处理过程。整体思路是赋值新的链表,用游离指针遍历原始链表进行翻转操作,当游离个数等于k时,就将翻转后的链表接到新的链表后&am…

【Flutter 常见问题系列 第 1 篇】Text组件 文字的对齐、数字和字母对齐中文

TextStyle中设置height参数即可 对齐的效果 Text的高度 是根据 height 乘于 fontSize 进行计算的、这里指定heiht即可、不指定的会出现 无法对齐的情况,如下: 这种就是无法对齐的情况

成为AI产品经理——模型评估(混淆矩阵)

一、混淆矩阵 1.混淆矩阵的介绍 混淆矩阵有两个定义positive(正例)和negative(反例)。分别代表模型结果的好和坏。 下图就是一个分类问题的混淆矩阵。横行代表真实的情况,而竖行代表预测的结果。 为了便于理解&…

原神「神铸赋形」活动祈愿现已开启

亲爱的旅行者,「神铸赋形」活动祈愿现已开启,「单手剑静水流涌之辉」「法器碧落之珑」概率UP! 活动期间,旅行者可以在「神铸赋形」活动祈愿中获得更多武器与角色,提升队伍的战斗力! 〓祈愿时间〓 4.2版本更…

VS2022 17.8: Build Insights 中的函数视图

简述 今天,我们很高兴的宣布在 Visual Studio 中为 Build Insights 新增了一项新功能:函数视图(Functions View)。 此功能在 Visual Studio 2022 v17.8 版本中可用。函数视图可以为你的代码库中的函数和强制内联(For…

C++学习之路(四)C++ 实现简单的待办事项列表命令行应用 - 示例代码拆分讲解

本期示例介绍: 本期示例《待办事项列表应用》展示了一个简单的任务管理系统,用户可以通过命令行界面执行添加任务、删除任务和显示任务列表等操作。 功能描述: 添加任务功能: 用户可以输入任务描述,将新的任务添加到任务列表中。…

基于SpringBoot+Vue的蛋糕商城【源码好优多】

简介 蛋糕商城首页、注册、登录、浏览商品、购物车、下单、收藏商品、个人中心、管理员登录、角色管理、日志管理、菜单管理、轮播图管理、商品类别管理、商品管理、用户管理、订单管理、收货地址管理等功能模块。 项目目录 数据库 首页 用户注册 登录 商品详情 个人信息 购物车…

【第二节:微信小程序 app.json配置】微信小程序入门,以思维导图的方式展开2

以思维导图的方式呈现出来,是不是会更加直观一些呢 如果看不清楚,私信给单发 : 第二节:微信小程序 app.json配置: 包括: window pages tabBar networkTimeout debug 如下图所示: 2、ap…

常见树种(贵州省):022绣线菊、月月青、金合欢、胡枝子、白刺花

摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、绣线菊…

linux之下安装 nacos

1 下载地址 也可使用在线下载wget https://github.com/alibaba/nacos/releases/download/1.4.6/nacos-server-1.4.6.tar.gzTags alibaba/nacos GitHuban easy-to-use dynamic service discovery, configuration and service management platform for building cloud nativ…

SWT/Jface(3): 表格中添加超链接

背景 实际业务中经常需要展示某个网站, 并且希望在展示的时候单击网站可直接访问, 本节演示在表格中如何添加超链接支持. 需求 假设我需要渲染一个Study类, 它只有三个属性id,name和website, 其中id只支持展示, name只支持编辑, 而website只支持单击时跳转到相应的网站, 效果…

软件介绍02- flameshot截图软件(linux系统可用)

1 软件介绍 在Windows和mac平台一直都使用着snipaste截图,非常好用,又能够钉图。遗憾是并没有开发linux版本,真不知道为什么。 好在终于找到一款截图软件,flameshot截图软件,可以平替snipaste。 下载网址:…

kali linux英文改中文

如果英语基础较好的同学可以不用调整 反之则需要 找到终端(就是输入命令的那个地方 如下)点击它出现命令终端 切换为root用户,命令为: sudo dpkg-reconfigure locales 然后回车 找到这个zh_CN 然后回车 鼠标下键选中并且回车 输…

【RTP】1: RTPSenderAudio::SendAudio

RTPSenderAudio 可以将一个opus帧封装为rtp包进行发送,以下是其过程:RTPSenderAudio::SendAudio :只需要提供payload部分 创建RtpPacketToSend 并写入各个部分 填充payload部分 sender 本身分配全session唯一的twcc序号 if (!rtp_sender_->