【JS】用女娲造人来理解原型对象

2024-02-04 16:30

本文主要是介绍【JS】用女娲造人来理解原型对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、JS的一个特点
可以动态的给对象添加属性或者方法

let obj = {} //定义了一个空对象
console.log(obj)
obj.name = "玛玛哈哈" //添加属性
obj.test = function() {console.log("我是玛玛哈哈哈哈哈哈哈")} //添加方法
console.log(obj)

在这里插入图片描述
二、原型对象

 //  只要我们创建一个函数,该函数就会自动获得一个prototype属性,这个属性指向函数的原型对象。
function fun() {}
console.log(fun.prototype, typeof fun.prototype);

在这里插入图片描述

从上图我们可以看出,函数有一个prototype属性,这个属性下面有一个constructor属性,constructor属性又指向函数对象Fn。

原型对象:(fun.prototype) 函数的prototype所指向的对象
原型对象中有一个constructor属性,它指向函数对象

在这里插入图片描述
设函数对象的名称为fun,fun有一个属性,名为prototype,其值指向fun的原型对象fun.prototype。然后fun.prototype下有一个属性,名为constructor,其值指向fun函数,即构造函数和它的原型对象相互引用。

相互引用(个人理解)
小红手里有一个本子(属性),里面记着小明的号码,小红可以通过这个本子联系到小明;小明手里同样有一个本子(但不是同一本),里面也有小红的号码,小明也可以通过这个本子找到小红。

原型的作用
函数的所有实例对象自动拥有原型中的属性或者方法
给原型对象添加属性(一般添加方法)是为了给实例对象使用。

以女娲造人为例,女娲造了一个泥潭(定义函数对象),然后开始造人,造出了小明,小红,小白(创建了三个实例),但是这仨都不会说话,女娲只好一个一个教,先教小红说话(动态添加自定义方法,即小红.说话=function(){}),然后又去教小明说话,然后到教小白的时候呢,女娲就想,我这样一个个教,要教到什么时候,哪还有时间甩泥巴呢!干脆我往泥巴里加点料(给原型添加方法),让这群泥崽子造出来的时候就自己会说话,不用我教,这多好呀~然后女娲就往泥巴里撒了些灰,再用藤条沾上泥浆,一甩,漫山遍野的人类被造出来了,都喊着女娲“娘啊娘啊”,女娲欣慰的笑了,终于不用教他们说话了。

上面的例子可以用代码表示为:

function CreateHuman() {} //定义函数对象
let xiaohong = new CreateHuman(); //创造了小红
let xiaoming = new CreateHuman(); //造了小明
let xiaobai = new CreateHuman(); //小白
//教小红说话
xiaohong.speak = function() {console.log("小红会说话啦");
}
xiaohong.speak(); //小红说话
xiaoming.speak(); //小明和小白还不会说话,所以报错
xiaobai.speak();

在这里插入图片描述

function CreateHuman() {} //定义函数对象
let xiaohong = new CreateHuman(); //创造了小红
let xiaoming = new CreateHuman(); //造了小明
let xiaobai = new CreateHuman(); //小白
//教小红说话
xiaohong.speak = function() {console.log("小红会说话啦");
}
xiaohong.speak(); //小红说话
//然后继续教小明和小白说话
xiaoming.speak = function() {console.log("小明会说话啦");
}
xiaobai.speak = function() {console.log("小白会说话啦");
}
xiaoming.speak(); //小明说话
xiaobai.speak(); //小白说话

在这里插入图片描述

//此时女娲陷入了沉思,决定往泥潭里撒灰
CreateHuman.prototype.speak = function() {console.log("我天生会说话哦");
};
//重新造人
let lrj = new CreateHuman;
lrj.speak(); //路人甲说话
let lry = new CreateHuman;
lry.speak(); //路人乙说话

在这里插入图片描述
然后看一下函数对象CreateHuman的原型对象

function CreateHuman() {} //定义函数对象
CreateHuman.prototype.speak = function() {console.log("我天生会说话哦");
};
console.log(CreateHuman.prototype);

在这里插入图片描述
多了一个speak方法,这就是给原型添加方法的作用。女娲不用一个一个的教人啦!

下一节:显式原型和隐式原型
https://blog.csdn.net/weixin_44707049/article/details/116256458

这篇关于【JS】用女娲造人来理解原型对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/678137

相关文章

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使