js中的原型链

news2024/10/2 14:22:50

js中原型和原型链😚

1、为什么需要原型链?🤣😚

凡事都是有一定的需求和原因发展起来的,在ECMA中为什么要提出原型链这个概念呢?

我们知道,创建对象有两种方式。一种是通过字面量来创建,另一种是通过new 来创建。

let p1 = {
    age:18,
    name:'张'
}
let p2 = {
    age:19,
    name:'李'
}
let p3 = {
    age:20,
    name:'王'
}

后来,发现这种创建对象的方式太过于复杂了,人们就开始研究,然后提出了工厂模式这个概念。顾名思义:工厂模式就是批量生产,批量产生。

比如创建几个person😚

/*
 * @Author: syk 185901261@qq.com
 * @Date: 2023-03-01 00:30:52
 * @LastEditors: syk 185901261@qq.com
 * @LastEditTime: 2023-03-01 00:31:25
 * @FilePath: \js面试题\2.proto\1.js
 * @Description: 
 * 
 * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
 */
let createPerson = function (age, name) {
    let p = {};
    p.age = age;
    p.name = name;
    p.eating = () => {
        console.log(this.name+"在吃东西");
    }
}
let w =  createPerson(19, "wang");
let l =  createPerson(19, "li");
let c =  createPerson(19, "chen");

但是使用这个模式有个缺点:使用typeof检测类型的时候,始终都是object。我们不知道具体的object是谁的object。

后来又使用了构造函数进行创建。构造函数也称构造器(constructor),在常见的面向对象语言当中(java),构造函数一般都存放在类当中,是类当中的一个方法,每当我们创建一个对象的时候,都会自动去调用这个类的构造函数。但是,在JavaScript中,构造函数展现了自己的特色。JavaScript对构造函数的定义是:一个普通的函数被new了,那么这个函数便是构造函数了

如果一个函数被使用new操作符调用了,那么它会执行如下操作:

  • 在内存中创建一个新的对象(空对象)
  • 这个对象==内部的[[prototype]]属性==会被赋值为该构造函数的prototype属性
  • 构造函数内部的this,会指向创建出来的新对象
  • 执行函数的内部代码(函数体代码)
  • 如果构造函数==没有返回非空对象,反之则返回创建出来的新对象==
/*
 * @Author: syk 185901261@qq.com
 * @Date: 2023-03-01 00:30:52
 * @LastEditors: syk 185901261@qq.com
 * @LastEditTime: 2023-03-01 00:41:19
 * @FilePath: \js面试题\2.proto\1.js
 * @Description: 
 * 
 * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
 */
let createPerson = function (age, name) {
    this.age = age;
    this.name = name;
    this.eating = () => {
        console.log(this.name+"在吃东西");
    }
}
let w = new createPerson(19, "wang");
let l = new createPerson(19, "li");
let c = new createPerson(19, "chen");

使用构造函数的缺点:每次创建都会保留一些方法,这些方法在内存区中不停创建,导致内存利用率不高。因此,原型链这个观点就提出来了。

2、原型前置知识😚😚

1、所有的==引用类型(数组、函数、对象)可以自由扩展属性==(除null以外)。

2、所有的引用类型都有一个’_ _ proto_ _'属性(也叫隐式原型,它是一个普通的对象)。

3、所有的函数都有一个’prototype’属性(这也叫显式原型,它也是一个普通的对象)。

4、所有引用类型,它的’_ _ proto_ _'属性指向它的构造函数的’prototype’属性。

5、当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去它的’_ _ proto_ _'属性(也就是它的构造函数的’prototype’属性)中去寻找。

对此,也就是,如果我们将eating这个函数放到原型链上去,内存是不是就被更加充分地利用了呢。

/*
 * @Author: syk 185901261@qq.com
 * @Date: 2023-03-01 00:30:52
 * @LastEditors: syk 185901261@qq.com
 * @LastEditTime: 2023-03-01 00:47:50
 * @FilePath: \js面试题\2.proto\1.js
 * @Description: 
 * 
 * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
 */
 function createPerson(age, name) {
    this.age = age;
    this.name = name;
}
createPerson.prototype = {
        eating : function() {
            console.log(this.name+"在吃东西");
     }
    }
let w = new createPerson(19, "wang");
let l = new createPerson(19, "li");
let c = new createPerson(19, "chen");
w.eating()
l.eating()

3.原型链

/*
 * @Author: syk 185901261@qq.com
 * @Date: 2023-03-01 20:33:08
 * @LastEditors: syk 185901261@qq.com
 * @LastEditTime: 2023-03-01 20:38:32
 * @FilePath: \js面试题\3.prototype\1.js
 * @Description: 
 * 
 * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
 */
function Person(name, age) {
    this.name = name;
    this.age = age;
}
Object.prototype.toString = function () {
    console.log("my name is"+this.name+"age is"+this.age);
}
let p = new Person('jack', 19);
console.log(p.toString === Person.prototype.__proto__.toString);// true
console.log(p.__proto__ === Person.prototype);// true
console.log(Person.prototype.__proto__===Object.prototype);// true

可以看到这个例子。三个log都为true。这也就体现了原型链之间的关系。

在这里插入图片描述
最后总结一下,使用原型的目的就是节省内存空间,减少不必要的内存支出!!!

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

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

相关文章

科研 | 论文写作 | 最常用的LaTeX语法

最常用的LaTeX语法1. 行内公式2. 行间公式3. 下标4. 上标5. 公式编号6. 数学公式7. 根号和分式8. 上下标记9. 向量10. 积分、极限、求和、乘积11. 三圆点12. 重音符号13. 矩阵14. 小写希腊字母和大写希腊字母15. 公式组合16. 拆分单个公式1. 行内公式 格式:将公式编…

流计算框架storm概览

Attention: supervison 和 nimbus的状态都实时保存在zookeeper集群中和本地. Enchance, this means you can kill -9 Nimbus or the Supervisors and theyll start back up as nothing happened. Topologies 1. storm jar all-my-code.jar org.apache.storm.MyTopology a…

父类子类静态代码块、构造代码块、构造方法执行顺序

github:https://github.com/nocoders/java-everything.git 名词解释 静态代码块:java中使用static关键字修饰的代码块,每个代码块只会执行一次,JVM加载类时会执行静态代码块中的代码,静态代码块先于主方法执行。构造代码块&#…

[Java面经] 三年工作经验, 极兔一二面

极兔一二面面经: 1. mysql的acid怎么实现的 这一点先回答ACID分别是A(原子性),C(一致性),I(隔离性),D(持久性), 其中持久性是数据库落磁盘的操作,无需额外实现. 隔离性是通过事务的隔离级别来实现, MySQL默认的隔离级别是RR(可重复读), 虽然上面还有一层Serializable(串行化…

如何在canvas中模拟css的背景图片样式

笔者开源了一个Web思维导图mind-map,最近在优化背景图片效果的时候遇到了一个问题,页面上展示时背景图片是通过css使用background-image渲染的,而导出的时候实际上是绘制到canvas上导出的,那么就会有个问题,css的背景图…

【日常总结】docker容器相互调用,占用服务器带宽解决方案

目录 一、场景: 1. 环境 2. 项目背景: 3. 全球时区解决方案 4. 方案二步骤 二、问题 三、产生原因 四、解决方案 五、解决步骤 六、整改效果 一、场景: docker容器相互调用,占用慢服务器带宽,导致netty连接的…

go 切片(slice)原理及用法注意事项

切片(slice)定义 go语言中的slice是一种数据结构,其定义为一个结构体,如下所示; type SliceHeader struct {Data uintptr // 指向底层数组的指针Len int // 切片的长度Cap int // 切片的容量 }切片与数组 切片的底层数据存储结构是 数组切片较为灵活,能动态扩容,而数组是定…

vue2使用v-viewer实现图片预览ImagePreview

追溯&#xff1a; View UI Plus 是 View Design 设计体系中基于 Vue.js 3 的一套 UI 组件库&#xff0c;里面有个组件ImagePreview可以实现“图片预览”。 使用ImagePreview组件&#xff0c;报错&#xff1a; [Vue warn]: Unknown custom element: <ImagePreview> - d…

odoo15 标题栏自定义

odoo15 标题栏自定义 如何显示为自定义呢 效果如下: 代码分析: export class WebClient extends Component {setup() {this.menuService = useService("menu");this.actionService = useService("action");this.title = useService("title&…

在Docker 上完成对Springboot+Mysql+Redis的前后端分离项目的部署(全流程,全截图)

本文章全部阅读大约2小时&#xff0c;包含一个完整的springboot vue mysqlredis前后端分离项目的部署在docker上的全流程&#xff0c;比较复杂&#xff0c;请做好心理准备&#xff0c;遇到问题可留言或则私信 目录 1 安装Docker&#xff0c;以及简单使用参照 2 Docker部署m…

HOT100--(3)无重复字符的最长子串

点击查看题目详情 大思路&#xff1a; 创建哈希表&#xff0c;元素类型为<char, int>&#xff0c;分别是字符与其对应下标 用哈希表来存储未重复的子串&#xff0c;若有重复则记录下当前子串最大值maxhashsize 并且开始以相同方法记录下一子串 遍历完成以后&#xff0c…

Android OpenCV(七十三):吊打高斯模糊的StackBlur Android 实践

前言 OpenCV 4.7.0 2022年12月28日Release,ChangeLog中提到 Stackblur algorithm implementation. Stackblur是一种高斯模糊的快速近似,由Mario Klingemann发明。其计算耗时不会随着kernel size的增大而增加,专为大kernel size的模糊滤波场景量身定制。 使用建议:当kerne…

[RDMA-高级计算机网络report] Congestion Control for Large-Scale RDMA Departments

本文主要解决的问题是在RoCEv2体系中&#xff0c;基于优先级的拥塞控制PFC是一种粗粒度的机制。 它在端口&#xff08;或端口加优先级&#xff09;级别上运行&#xff0c;并且不区分流。PAUSE机制是基于每个端口&#xff08;和优先级&#xff09;的&#xff0c;而不是基于每个流…

mysql数据库之索引使用原则

一、最左前缀法则。 1、如果索引使用了多列&#xff08;联合索引&#xff09;&#xff0c;要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始&#xff0c;并且不跳过索引中的列。 如果跳跃到某一列&#xff0c;索引将部分失效&#xff08;后面的字段索引失效&am…

springboot启动时遇见的版本不同、无法启动、自动停止问题解决方案

Springboot项目启动失败初来乍到&#xff0c;听说springboot很好用&#xff0c;很简便&#xff0c;于是爱搞事情的我就打算试试&#xff0c;因为最近在找工作&#xff0c;很多软件开发的也要求springboot的使用&#xff0c;于是我就开启了springboot的学习之旅&#xff0c;打算…

Vue3 企业级项目实战:认识 Spring Boot

Vue3 企业级项目实战 - 程序员十三 - 掘金小册Vue3 Element Plus Spring Boot 企业级项目开发&#xff0c;升职加薪&#xff0c;快人一步。。「Vue3 企业级项目实战」由程序员十三撰写&#xff0c;2744人购买https://s.juejin.cn/ds/S2RkR9F/ 越来越流行的 Spring Boot Spr…

人工智能及其应用(蔡自兴)期末复习

人工智能及其应用&#xff08;蔡自兴&#xff09;期末复习 相关资料&#xff1a; 人工智能期末复习 人工智能复习题 人工智能模拟卷 人工智能期末练习题 1 ⭐️绪论 人工智能&#xff1a;人工智能就是用人工的方法在机器&#xff08;计算机&#xff09;上实现的智能&#xff0…

攻不下dfs不参加比赛(八)

标题 为什么练dfs题目重点为什么练dfs 相信学过数据结构的朋友都知道dfs(深度优先搜索)是里面相当重要的一种搜索算法,可能直接说大家感受不到有条件的大家可以去看看一些算法比赛。这些比赛中每一届或多或少都会牵扯到dfs,可能提到dfs大家都知道但是我们为了避免眼高手低有…

2.2 数据库的常用操作

文章目录1.分类2.创建数据库3.删除数据库4.查看所有数据库5.备份数据库6.数据库维护7.数据库使用与结构7.1 数据库的使用7.2 数据库结构虽然我们已经安装了可视化视图软件&#xff0c;但前期为了熟悉管理命令行的操作&#xff0c;我们暂时先在管理命令窗口进行操作&#xff1a;…

关于.bashrc和setup.bash的理解

在创建了ROS的workspace后&#xff0c;需要将workspace中的setup.bash文件写入~/.bashrc 文件中&#xff0c;让其启动&#xff1a; source /opt/ros/melodic/setup.bash这句话的目的就是在开新的terminal的时候&#xff0c;运行这个setup.bash&#xff0c;而这个setup.bash的作…