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

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

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

相关文章

Linux命令(134)之install

linux命令之install 1.install介绍 linux命令install是用来复制文件并设置其属性 2.install用法 install [参数] source destination install参数 参数说明-m设定目标文件权限,默认为755-o设定目标文件属主-g设定目标文件属组-d创建目录 3.实例 3.1.复制/etc/…

C语言题目强化-DAY14

题型指引 一、选择题二、编程题 ★★写在前面★★ 本题库源自互联网,仅作为个人学习使用,记录C语言题目练习的过程,如果对你也有帮助,那就点个赞吧。 一、选择题 1、有以下函数,该函数的功能是( &#xff…

wangeditor实时预览

<template><div><!--挂载富文本编辑器--><div style"width: 45%;float: left;margin-left: 2%"><p>编辑内容</p><div id"editor" style"height: 100%"></div></div><div style"w…

日本运营商启动先进边缘云技术研发

摘要&#xff1a;日本运营商乐天移动最近启动了为 5G 之后的下一个通信标准开发边缘平台功能的研发工作。 乐天移动&#xff08;Rakuten Mobile&#xff09;表示&#xff0c;其面向下一代通信的先进边缘云技术研发&#xff08;R&D&#xff09;项目已被日本国家信息通信技术…

获取WordPress分类链接

CMS模板主题首页多以分类列表的形式展示内容&#xff0c;一般需要在适当位置添加某分类归档页面链接的按钮&#xff0c;下面的代码可以帮你实现。 代码一、通过分类别名获取Wordpress分类链接&#xff1a; <?php $catget_category_by_slug(‘wordpress’); $cat_linksget_…

27. Spring源码篇之SpEL表达式之自定义解析模版

简介 其实前面文章我们已经介绍过了如何定义spring表达式的解析模版&#xff0c;但是那是直接使用表达式api的形式&#xff0c;对于使用spring的同学来说&#xff0c;更优雅的方式就是可以自定义一个扩展去修改 本文就是介绍如何通过Spring的扩展点修改表达式解析模版 自定义…

【Linux】信号

Linux 信号 1.信号介绍2.core dump3.发送信号3.1.kill3.2.send3.3.abort 4.信号产生4.1.软件条件产生信号4.1.1.SIGPIPE4.1.2.SIGALRM 4.2.硬件异常产生信号 5.信号处理6.可重入函数 & volatile7.SIGCHLD 1.信号介绍 信号本质是一种通知机制。 而进程要处理信号&#xff0…

windows通过regsvr32注册dll文件失败

1、注册dll文件失败 最近在研究中文输入法&#xff0c;下载SampleIME源码后编译得到SampleIME.dll&#xff0c;最后只需要将输入法安装&#xff08;即注册&#xff09;就可以使用了。 但是通过命令&#xff1a; regsvr32 C:\Windows\System32\SampleIME.dll 注册时却提示错…

【3 栈和队列】链队的操作。

结构体&#xff1a; typedef struct QNode{int data;struct QNode *next; }QNode;typedef struct{QNode *front,*rear; }*LinkQueue; 初始化、判空&#xff1a; void InitQueue(LinkQueue &Q){ //初始化 Q.frontQ.rear(QNode*)malloc(sizeof(QNode)); //建立头结点…

6.2 Windows驱动开发:内核枚举SSSDT表基址

在Windows内核中&#xff0c;SSSDT&#xff08;System Service Shadow Descriptor Table&#xff09;是SSDT&#xff08;System Service Descriptor Table&#xff09;的一种变种&#xff0c;其主要用途是提供Windows系统对系统服务调用的阴影拷贝。SSSDT表存储了系统调用的函数…

光线追踪-Peter Shirley的RayTracing In One Weekend系列教程(book1-book3)代码分章节整理

自己码完了一遍了&#xff0c;把代码分章节整理了一下&#xff0c;可以按章节独立编译&#xff0c;运行, 也可以直接下载编译好的release版本直接运行。 项目地址&#xff1a; Github: https://github.com/disini/RayTracingInOneWeekendChaptByChapt ​ ​ ​ ​

transformers pipeline出现ConnectionResetError的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

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

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

内容运营常用的ChatGPT通用提示词模板

内容定位&#xff1a;请帮助我明确我们的内容定位&#xff0c;包括目标受众、内容类型、主题、风格等方面的内容&#xff0c;以便我能够更好地制定内容策略和规划。 内容策划&#xff1a;请帮助我制定一个详细的内容策划方案&#xff0c;包括内容主题、风格、形式、发布时间等…

软件测试高职教师组比赛复盘

1、考试分为四个模块&#xff1a; 任务1&#xff1a;自动化测试30分&#xff0c;4道题 任务2&#xff1a;单元测试20分&#xff0c;4道题 任务3&#xff1a;接口测试20分&#xff0c;2道题 任务4&#xff1a;性能测试30分&#xff0c;LoadRunner和Jmeter两个。 2、考试时间…

linux复习笔记05(小滴课堂)

hell脚本与crontab定时器的运用 查看状态&#xff1a; 关闭服务&#xff1a; 开启服务&#xff1a; 重启服务&#xff1a; crontab定时器的使用&#xff1a; 我们可以看到没有任何任务。 编辑&#xff1a; 我们可以看到这个任务了。 删除所有任务&#xff1a; 这代表着每分钟…

5.一维数组——输入一行字符,统计其中各个大写字母出现的次数。

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、举一反三一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为一维数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 输入一行字符&#xff0c;统计其中各个大写字母出现的…

Android控件全解手册 - 自定义ViewGroup卫星导航菜单

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列

Redis序列化操作

目录 1.protostuff 的 Maven 依赖 2.定义实体类 3.序列化工具类 ProtostuffSerializer 提供了序列化和反序列化方法 4.测试 利用 Jedis 提供的字节数组参数方法&#xff0c;如&#xff1a; public String set(String key, String value) public String set(byte[] key…

LeetCode 1457. 二叉树中的伪回文路径

原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 耗时&#xff1a;28min48s C代码 dfs、二叉树前序遍历、哈希表记录 #include<bits/stdc.h> using namespace std;struct TreeNode {int val;TreeNode *left;TreeNode *rig…