【JavaScript】原型链

news/2025/2/23 2:39:06/

文章目录

      • 构造函数
      • 原型
      • 对象访问机制
      • 内置构造函数
      • 一切皆对象
      • 原型链

构造函数

        - 本质还是一个函数- 和 new 关键字连用- 特点1. 自动创建一个对象2. 自动返回一个对象3. 让函数的this指向这个对象 书写构造函数的时候1. 属性写在函数内2. 方法写在原型上

构造函数的不合理
把方法写在构造函数内的时候,随着实例增加,会额外创建很多一样的方法

原型

        💡  每一个 函数天生自带一个属性 prototype, 是一个对象💡   每一个 对象天生自带一个属性 __proto__, 指向所属的构造函数的原型 prototype

对象访问机制

            当访问一个对象的成员的时候,首先会在自己身上找如果没有,会自动找到自己的__proto__

原型 prototype
把公共的方法提取出来,在原型上书写,只用书写和创建一次
在JS中有若干内置构造函数
Object
Array
Date
RegExp
Function

function Person() { }// p1是一个实例对象, 是Person的实例对象// p1所属的构造函数 Person// p1的 __proto__ 指向 Person.prototypeconst p1 = new Person()console.log(p1.__proto__ === Person.prototype);/* p1是一个实例化对象,Person是一个构造函数,p1所属的构造函数是Person p1是一个对象,天生自带__proto__,所以p1.__proto__是小袋鼠的家也就等同于袋鼠妈妈的口袋.所以p1.__proto__是指向所属构造函数原型也就是Person.prototype,指向的意思是相等*/// 举一反三// 任何一个数组, 所属的构造函数是 Array// 任何一个对象, 所诉的构造函数是 Objectfunction Array() {}function Object() {}let arr = new Array();let obj = new Object();//都是全等的console.log(arr.__proto__ === Array.prototype);console.log(obj.__proto__ === Object.prototype);

内置构造函数

扩展方法
在内置构造函数的原型上扩展一个新方法, 所有的数组都可以使用这个方法
案例1: 给Array上的原型扩展一个方法, 返回数组里面的最大值

// 需求, 扩展一个方法, 返回数组里面的最大值Array.prototype.getMax = function () {// let max = Math.max(...arr);let max = Math.max(...this); //this指向arrreturn max;};let arr = [1, 2, 2, 2, 3, 400, 200, 300];console.log(arr.getMax());

案例2: 给Array上的原型扩展一个方法, 给数组去重

// 需求 扩展一个方法, 给数组去重
Array.prototype.noRepeat = function () {let newArr = [];arr.forEach((item) => {if (newArr.indexOf(item) == -1) {newArr.push(item);}});return newArr;
};let arr = [1, 2, 2, 2, 3, 400, 200, 300];
console.log(arr.noRepeat());

现在我们来解决: 把公共的方法提取出来,在原型上书写,只用书写和创建一次, 这样所有的对象都可以使用

//使用内置构造函数原型创建新方法
Object.prototype.sing = function () {console.log("唱跳rap");
};function Teacher() {}
// 之前的思路是直接给构造函数单独创建一个方法
// Teacher.prototype.sing = function () {
//         console.log("唱跳rap");
//       };function Student() {}
// 之前的思路
// Student.prototype.sing = function () {
//         console.log("唱跳rap");
//       };let t1 = new Object();
let s1 = new Object();t1.sing();
s1.sing();
console.log(t1.sing());//这里打印会有undefined是因为打印的是函数的返回值,函数没有return
console.log(s1.sing());

小结: 之前的思路是直接给构造函数单独创建一个方法,这样每个构造函数都需要创建一个相同的方法会很麻烦,所以我们直接给内置的构造函数扩展一个方法,这样所有的对象都可以直接使用

一切皆对象

    对象- 一种数据结构  {name: 'tom' ,age : 18}- 一类内容中的一个真实个例属的构造函数就是Array只要是 {} 所属的构造函数就是Object只要是 function () {} 所属的构造函数就是Function

原型链

问题1 p.__proto__指向

function Person() {}
const p = new Person();
/* 问题1  p.__proto__指向每一个对象的__proto__指向所属构造函数的原型Person.prototype*/
console.log(p.__proto__ === Person.prototype);
// console.log(typeof Person.prototype); //对象数据类型

问题2 Person.prototype.proto 指向哪里

function Person() {}
const p = new Person();/* 问题2 Person.prototype.__proto__ 指向哪里分析:1.这里将Person.prototype看做一个整体 是一个对象数据类型(原型概念)2.Person.prototype.__proto__ 指向所属构造函数的原型3.所属的构造函数是一个对象,所以指向Object.prototype*/console.log(Person.prototype.__proto__ === Object.prototype);

问题3 Person.proto 指向哪里

function Person() {}
const p = new Person();/* 问题3 Person.__proto__ 指向哪里分析:1.Person.__proto__ 指向所属构造函数的原型2.所属构造函数是一个函数,所以指向Funciton.prototype*/console.log(Person.__proto__ === Function.prototype);

问题4 Function.proto 指向哪里

function Person() {}
const p = new Person();/* 问题4 Function.__proto__ 指向哪里分析:1.Function.__proto__ 指向所属构造函数的原型2.所属构造函数是谁?  由于Function本身是一个构造函数,所以指向Function,这个比较特殊*/console.log(Function.__proto__ === Function.prototype);

问题5 Object.proto 指向哪里

function Person() {}
const p = new Person();/* 问题5 Object.__proto__ 指向哪里分析:1.Object.__proto__ 指向所属构造函数的原型2.Object是一个内置构造函数,所以指向Function*/console.log(Object.__proto__ === Function.prototype);

问题6 Function.prototype.proto 指向哪里

function Person() {}
const p = new Person();/* 问题6 Function.prototype.__proto__ 指向哪里分析:1.Function.prototype.__proto__指向所属构造函数的原型2.Function.prototype所属构造函数是Object*/console.log(Function.prototype.__proto__ === Object.prototype);

问题7 Object.prototype.proto 指向哪里

function Person() {}
const p = new Person();/* 问题7 Object.prototype.__proto__ 指向哪里分析:1.Object.prototype 是顶级原型2.Object.prototype.__proto__ 指向null*/console.log(Object.prototype.__proto__ === null);


http://www.ppmy.cn/news/20879.html

相关文章

Blender 渲染与后期处理

文章目录旋转环境贴图(天空盒)物体只渲染其他物体的阴影而不渲染自身渲染一个背景透明的图片在后期合成中,将渲染结果和一张图片合成到一起输出不同的通道方法一方法二后期制作景深效果渲染单个图层图层渲染单个图层旋转环境贴图(…

HTTPS

基于TLS的HTTP 基于SSL/TLS的HTTP(Hyper Text Transfer Protocol over Secure Socket Layer,HTTPS),在TCP基础上建立TLS安全连接,经过TLS 安全连接实现对Web服务器的身份鉴别,浏览器和Web服务器之间传输的…

MySQL运维(二)MySQL分库分表概念及实战、读取分离详解

MySQL运维(二)MySQL分库分表详解、读取分离详解 1、MySQL分库分表相关概念 1.1 分库分表概念 1.1.1 分库的原因 分库:就是一个数据库分成多个数据库,部署到不同机器。 如果业务量剧增,数据库可能会出现性能瓶颈,这时候我们就需…

numpy快速交换行列

import numpy as np “”" 快速加换两行两列 “”" #交换两列第一列跟第三列 v1np.arange(100) v2v1.reshape((20,5)) v3v2[:,[0,3,2,1,4]] print(v3) “”" 快速交换两列 第一列跟第三列 “”" print() mask list(range(5))#生成一个0到4的列表 #快速…

P3371 【模板】单源最短路径(弱化版)

# 【模板】单源最短路径(弱化版) ## 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 [P4779](https://www.luogu.org/problemnew/show/P4779)。 ## 题目描述 如题,给出一个有…

使用Springboot 2.7+Websocket+js实现服务端消息实时推送

文章目录诉求相关技术相关步骤项目创建编写相关配置消息逻辑处理使用JavaScript实现Websocket的前端功能功能测试诉求 模拟服务端主动推送消息给客户端,同时展示客户端发送给客户端的消息以及服务端推送给客户的消息。 相关技术 Springboot(2.7.0)Websocketjavascr…

【金融学】中国经济专题

中国经济专题P1 中国经济专题课程来源:【北京大学】中国经济专题。林毅夫 链接地址:https://www.bilibili.com/video/BV1kB4y1H7R4/?spm_id_from333.337.search-card.all.click&vd_source0430935ec172299adfb0bef974e9022a P1 中国经济专题 1820年…

网易二面:CPU狂飙900%,该怎么处理?

说在前面 社群一位小伙伴面试了 网易,遇到了一个 性能类的面试题: CPU飙升900%,该怎么处理? 可惜的是,以上的问题,这个小伙没有回答理想。 最终,导致他网易之路,终止在二面&…