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

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应用奠定坚实基础。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RHCE---给openlab搭建web网站

作业:请给openlab搭建web网站 网站需求: 1.基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站, 1、基于 www.openlab.com/student 网站访问学生信…

C#,《小白学程序》第十八课:随机数(Random)第五,方差及标准方差(标准差)的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十八课&#xff1a;随机数&#xff08;Random&#xff09;第五&#xff0c;方差及标准方差&#xff08;标准差&#xff09;的计算方法与代码 /// 方差 SUM(&#xff08;Xi - X)^2 ) / n i0...n-1 X Average of X[i] ///…

如果客户端同时有ipv4和ipv6,浏览器是如何选择用哪种ip

在互联网协议&#xff08;IP&#xff09;的发展历程中&#xff0c;IPv4和IPv6是两种主要的版本。对于一个客户端来说&#xff0c;同时拥有IPv4和IPv6的能力是常见的情况。那么&#xff0c;当一个客户端同时具有IPv4和IPv6的能力时&#xff0c;浏览器是如何选择使用哪种IP进行通…

redis(Remote Dictionary Service) 底层数据结构

redis 底层数据结构 动态字符串SDS 优点 获取字符串长度的时间复杂度O(1) 支持动态扩容&#xff0c;减少内存分配次数 新字符串小于1M – 新空间为扩展后字符串长度的两倍 1 新字符串大于1M – 新空间为扩展后字符串长度 1M 1. 内存预分配 二进制安全&#xff08;记录了…

高并发系统:它的通用设计方法是什么?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 我们知道&#xff0c;高并发代表着大流量&#xff0c;高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案&#xff0c;从而抵抗巨大流量的冲击&#xff0c;带给用户更好的使用体验。这些方案好似能…

Kerberos 高可用配置和验证

参考 https://cloud.tencent.com/developer/article/1078314 https://mp.weixin.qq.com/s?__bizMzI4OTY3MTUyNg&mid2247485861&idx1&snbb930a497f63ac5e63ed20c64643eec5 机器准备 Kerberos主 ip-172-31-22-86.ap-southeast-1.compute.internal 7.common2.hado…

【洛谷算法题】P5715-三位数排序【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5715-三位数排序【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式…

Python----函数的数据 拆包(元组和字典)

Python拆包&#xff1a; 就是把元组或字典中的数据单独的拆分出来&#xff0c;然后赋予给其他的变量。 拆包: 对于函数中的多个返回数据, 去掉 元组, 列表 或者字典 直接获取里面数据的过程。 元组的拆包过程 def func():# 经过一系列操作返回一个元组return 100, 200 …

100天精通Python(可视化篇)——第109天:Pyecharts绘制各种常用地图(参数说明+代码实战)

文章目录 专栏导读一、地图应用场景二、参数说明1. 导包2. add函数 三、地图绘制实战1. 省市地图2. 中国地图3. 中国地图&#xff08;带城市&#xff09;4. 中国地图&#xff08;分段型&#xff09;5. 中国地图&#xff08;连续型&#xff09;6. 世界地图7. 行程轨迹地图8. 人口…

LCR 047. 二叉树剪枝 和 leetCode 1110. 删点成林 + 递归 + 图解

给定一个二叉树 根节点 root &#xff0c;树的每个节点的值要么是 0&#xff0c;要么是 1。请剪除该二叉树中所有节点的值为 0 的子树。节点 node 的子树为 node 本身&#xff0c;以及所有 node 的后代。 示例 1: 输入: [1,null,0,0,1] 输出: [1,null,0,null,1] 解释: 只有红…

【古诗生成AI实战】之一——实战项目总览

[1] 总览 【古诗生成AI实战】系列共五篇文章&#xff1a; 【古诗生成AI实战】之一——实战项目总览   【古诗生成AI实战】之二——项目架构设计   【古诗生成AI实战】之三——任务加载器与预处理器   【古诗生成AI实战】之四——模型包装器与模型的训练   【古诗生成AI…

rust tokio select!宏详解

rust tokio select!宏详解 简介 本文介绍Tokio中select!的用法&#xff0c;重点是使用过程中可能遇到的问题&#xff0c;比如阻塞问题、优先级问题、cancel safe问题。在Tokio 中&#xff0c;select! 是一个宏&#xff0c;用于同时等待多个异步任务&#xff0c;并在其中任意一…

MySQL简单介绍

简单了解MySQL MySQL语句分类 SQL语句分类 DDL&#xff1a;数据定义语句 create表&#xff0c;库.….] DML&#xff1a;数据操作语句 [增加insert&#xff0c;修改 update&#xff0c;删除delete] DQL&#xff1a;数据查询语句 [select] DCL&#xff1a;数据控制语句 …

【RTP】3: RTPSenderVideo::SendVideo 切片到发送

m98 版本。之前1 2 都是m79.RTPSenderVideo::SendVideo 负责切片,是入口 实际发送要靠: RTPSender* const rtp_sender_; 外部传递的: rtp_rtcp\source\rtp_sender.h 实现了rtp rtcp协议 ,负责实际的打包 新增了一个 TransformableFrameInterface 用的 编码线程 - RTPSend…

【算法萌新闯力扣】:卡牌分组

力扣热题&#xff1a;卡牌分组 一、开篇 今天是备战蓝桥杯的第22天。这道题触及到我好几个知识盲区&#xff0c;以前欠下的债这道题一并补齐&#xff0c;哈希表的遍历、最大公约数与最小公倍数&#xff0c;如果你还没掌握&#xff0c;这道题练起来&#xff01; 二、题目链接:…

关于el-table的二次封装及使用,支持自定义列内容

关于el-table的二次封装及使用 table组件 <template><el-table ref"tableComRef" :data"tableData" border style"width: 100%"><el-table-column v-if"tableHeaderList[0]?.type selection" type"selection&…

下载网页内容成HTML文件

今天遇到了一个非常好用的、开源的网页下载插件: SingleFile&#xff0c;它可以将当前网页里的文字、图片、超链接等&#xff0c;合并成单一的.html文件&#xff0c;便于保存和浏览查看。下面介绍SingleFile的安装和使用。 1、下载SingleFile插件 SingleFile官网地址&#xff…

如何使用JMeter测试导入接口/导出接口

今天一上班&#xff0c;被开发问了一个问题&#xff1a;JMeter调试接口&#xff0c;文件导入接口怎么老是不通&#xff1f;还有导出文件接口&#xff0c;不知道文件导到哪里去了&#xff1f; 我一听&#xff0c;这不是JMeter做接口测试经常遇到的嘛&#xff0c;但是一时半会又…

STM32-SPI3控制MCP3201、MCP3202(Sigma-Delta-ADC芯片)

STM32-SPI3控制MCP3201、MCP3202&#xff08;Sigma-Delta-ADC芯片&#xff09; 原理图手册说明功能方框图引脚功能数字输出编码与实值的转换分辨率设置与LSB最小和最大输出代码&#xff08;注&#xff09; 正负符号寄存器位MSB数字输出编码数据转换的LSB值 将设备输出编码转换为…

Ps:使用钢笔工具绘制自由路径的技巧

只有熟练掌握使用钢笔工具绘制自由路径的技巧&#xff0c;才能快速完成复杂形状的创建以及精准抠图等工作。 钢笔工具是 Photoshop 中绘制路径的主要工具。无论是直线路径还是曲线路径&#xff0c;钢笔工具都能够提供高度的控制和精确度。 ◆ ◆ ◆ 绘制直线路径 绘制直线路径…