文章目录

  • 原型链关键字总结
    • 原型对象:prototype
    • 对象原型:__ proto__
  • 面向对象编程
    • 封装
    • 抽象
    • 多态
    • 总结
  • 异步编程
    • 基础循环
    • 宏任务嵌套微任务


原型链关键字总结

原型对象:prototype

函数的属性,指向一个对象,这个对象是通过该函数作为构造函数创建的所有实例的原型

修改原型会影响所有已创建的实例,但重写整个原型对象不会影响已创建的实例。

如下
重写了整个原型对象,但依旧输出1,只有新建的才输出2
个人理解是
new调用构造函数时,会给实例的__ proto__,(也就是函数的prototype),赋予函数的prototype值,也就是浅拷贝,二者指向同一对象,而再次新建时修改了原指针,指向了新的原型对象,但旧实例,还是有原对象的索引

function Foo() {}
const foo1 = new Foo();
const foo2 = new Foo();Foo.prototype.value = 1;
console.log(foo1.value);
console.log(foo2.value);Foo.prototype = { value: 2 };
const foo3 = new Foo();
console.log(foo1.value);
console.log(foo2.value);
console.log(foo3.value);
//1 1 1 1 2

对象原型:__ proto__

对象的属性:指向该对象的构造函数的原型(对象)

console.log(man.prototype);//man是函数,manba是其实例
console.log(manba.__proto__);
//{ name: '', age: '' }
//{ name: '', age: '' }
new` 关键字会创建一个新的空对象,并将该对象的 `__proto__` 设置为 `man.prototy
function People(name){this.name=name}
//people方法
People.prototype.Hello=function(){return `Hello ${this.name}`
}function Student(name,score){People.call(this,name)this.score=score
}
//将student的原型指向Person的原型,继承了person的方法
//未指定原型实例无法访问父类方法Student.prototype=Object.create(People.prototype)//指定原型后constructor会指向父类构造函数,修复
Student.prototype.constructor=Student
//
let xiaoming= new Student('xiaoming','80')
console.log(xiaoming);
console.log(xiaoming.constructor);
console.log(xiaoming.Hello());

create

Object.create(People.prototype);
//创建一个新People.prototype对象,它的原型指向People.prototype

class实现

class People{constructor(name){this.name=name}Hello(){return `Hello ${this.name}`}
}//继承
class Student extends People{constructor(name,score){super(name)this.score=score}printScore(){return `score : ${this.score}`}
}
let p1=new People('xiaoF')let stu=new Student('xiaoming','100')
console.log(stu.printScore());
console.log(stu.Hello());
console.log(p1.Hello());
//console.log(p1.printScore());(无)

面向对象编程

封装

  1. 私有属性

    _约定,#真语

    同样有静态属性和方法

    class Person {constructor(name, age) {this._name = name; // 使用下划线表示私有属性this._age = age;}
    }
    
  2. 私有方法

    class animal{#name;constructor(name){this.#name=namethis.#firstPrint()}getName(){return this.#name}#firstPrint(){console.log(this.#name);}firstPrint(){console.log(this.#name);}
    }
    let dog =new animal('dog')
    dog.firstPrint()
    

    带#与不带#可以同时存在,为俩种不同的方法

    还可以组合私有静态

class Cat extends Animal{static  #count=0constructor(name){super()this.name=name;(Cat.#count)++}static getNum(){return Cat.#count}
}let cat1=new Cat('mm')
console.log( Cat.getNum());

抽象

没有java类似的抽象类关键字

只能通过throw error来模拟抽象类

new.target 不仅可以在类的构造函数中使用,还可以在任何函数中使用。它是一个特殊的元属性,用于检测当前函数是否通过 new 关键字被调用,以及调用时的构造函数是什么。

// 模拟抽象类
class Shape {constructor() {if (new.target === Shape) {throw new Error("Cannot instantiate abstract class");}}// 抽象方法area() {throw new Error("Abstract method must be implemented");}
}

多态

实现多态发生原型链的分支

class Cat extends Animal{static  #count=0constructor(name){super()this.name=name;(Cat.#count)++}static getNum(){return Cat.#count}Print(){console.log( `cat: ${this.name}`);}
}class dog extends Animal{static #count=0constructor(name){super()this.name=name;(dog.#count)++}static getNum(){return dog.#count}Print(){console.log(`dog: ${this.name}`);}
}

总结

并未含有java类似的关键字(abstract)严格声明,而是通过抛出错误等来进行限制

异步编程

基础循环

遵循同步任务->微任务->宏任务
清空微任务队列后,才会进入下一次宏任务,如此循环
微任务由js自身发起的,如promise
宏任务由浏览器发起,如settimeout

setTimeout(() => {// 宏任务console.log('setTimeout');
}, 0);new Promise((resolve, reject) => {resolve();console.log('promise1'); // 同步任务
}).then((res) => {// 微任务console.log('promise then');
});console.log('同步任务'); // 同步任务

解析

  1. 第一个宏任务setTimeout暂存,
  2. 执行promise的构造函数(同步任务)//修改promise的状态,触发then的微任务暂存并输出promise1
  3. 执行最终的log输出同步任务
  4. 微任务队列不为空,执行输出promise then
  5. 执行最终宏任务 输出setTimeout

输出顺序

promise1
同步任务
promise then
setTimeout

宏任务嵌套微任务

new Promise((resolve, reject) => {setTimeout(() => {resolve();console.log('setTimeout'); // 宏任务}, 0);console.log('promise1');
}).then((res) => {// 微任务console.log('promise then');
});console.log('同步任务');
  1. 暂存promise构造函数中的宏任务并输出promise1
  2. 由于promise的状态在宏任务中改变,故then还未触发,输出最后的同步任务
  3. 此时 微任务未空,执行暂存的宏任务, resolve();触发微任务,并输出同步任务promise1’
  4. 执行then输出promise then

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

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

相关文章

Spring Boot + KingbaseES 连接池实战

文章目录一、前言二、什么是数据库连接池?三、SpringBoot KingbaseES 环境准备3.1 加依赖(pom.xml)3.2 基础连接信息(application.yml)四、四类主流连接池实战4.1 DBCP(迁移型 / 传统项目友好)…

矩阵待办ios app Tech Support

Getting Support: mail: 863299715qq.com

React中优雅管理CSS变量的最佳实践

在现代前端开发中,CSS变量(也称为CSS自定义属性)已成为管理样式系统的重要工具。它们提供了强大的动态样式能力,但在JavaScript中高效地访问和使用这些变量却存在一些挑战。本文将介绍一个优化的解决方案,帮助你在Reac…

智能制造——解读装备制造业智能工厂解决方案【附全文阅读】

适应人群为装备制造企业(如汽车、航空航天、能源装备等)中高层管理者、生产运营负责人、IT 部门(智能制造 / 工业互联网团队)、安全管理专员及园区数字化建设决策者。主要内容围绕装备制造业智能工厂解决方案展开,核心包括建设背景(解决生产安全管理缺失、工序手工记录无…

macos调用chrome后台下载wasm-binaries.tar.xz

实现脚本: down_wasm.sh DOWNLOAD_DIR="$HOME/Downloads" TARGET_FILE="wasm-binaries.tar.xz" TAG="32b8ae819674cb42b8ac2191afeb9571e33ad5e2" TARGET_DIR="$HOME/Desktop/sh/emsdk_setup/emsdk_deps"echo "下载路径: $DOW…

【Proteus仿真】按键控制系列仿真——LED灯表示按键状态/按键控制LED灯/4*4矩阵键盘控制LED

目录 1案例视频效果展示 1.1例子1:LED灯表示按键状态(两种方式) 1.2例子2:按键控制两排LED小灯闪烁移位 1.3例子3:按键控制LED灯逐个点亮/分组点亮/全部熄灭 1.4例子4:4*4矩阵按键实现带状LED灯控制 2例子1:LED灯…

829作业

用fgets&#xff0c;fputswanc代码#include<myhead.h> int main(int argc, const char *argv[]) {FILE *fp1 NULL;FILE *fp2 NULL;if (argc ! 3){printf("输入不合法:./a.out lydf.txt l.txt\n");return -1;}if ((fp1fopen(argv[1],"w"))NULL){pri…

CRMEB小程序订阅消息配置完整教程(PHP版)附常见错误解决

登录小程序后台 1.进入微信公众平台、小程序后台&#xff1a;功能->订阅消息。&#xff08;如未开通&#xff0c;点击申请即可开通&#xff09; 选择服务类目 2.选择服务类目&#xff1a;生活服务/百货/超市/便利店 同步小程序订阅消息 3.商城后台设置->消息管理 点击…

【已解决】阿里云服务器上前端访问不到后端

最开始我觉得后端根本没跑起来&#xff0c;但是我没用过阿里云的服务器&#xff0c;对pm2指令也完全不熟&#xff0c;不确定后端是不是在哪个我不知道的地方跑着。 还以为在阿里云控制台点运行&#xff0c;服务就会自己跑起来&#xff0c;但远程连接之后发现搞着搞着&#xff0…

分治算法详解:从递归思想到经典应用实战

分治算法是计算机科学中最重要的算法设计策略之一&#xff0c;它将复杂问题分解为规模更小的同类子问题&#xff0c;通过递归求解子问题并合并结果来解决原问题。本文将深入探讨分治算法的核心思想、设计模式以及经典应用案例。 文章目录一、分治算法核心思想1.1 分治策略的三个…

GitHub 热榜项目 - 日榜(2025-08-31)

GitHub 热榜项目 - 日榜(2025-08-31) 生成于&#xff1a;2025-08-31 统计摘要 共发现热门项目&#xff1a;15 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜凸显三大技术热点&#xff1a;1) AI基础设施爆发式增长&#xff0c;微软MCP协议和Activepieces的A…

OpenCL C 平台与设备

1. 核心概念在 OpenCL C API 中&#xff1a;平台 (Platform)&#xff1a;代表一个 OpenCL 实现&#xff0c;通常对应硬件厂商&#xff08;NVIDIA、AMD、Intel等&#xff09;设备 (Device)&#xff1a;具体的计算硬件单元&#xff08;GPU、CPU、加速器等&#xff09;上下文 (Con…

R语言贝叶斯方法在生态环境领域中的高阶技术应用

贝叶斯统计已经被广泛应用到物理学、生态学、心理学、计算机、哲学等各个学术领域&#xff0c;其火爆程度已经跨越了学术圈。一&#xff1a; 1.1复杂数据回归&#xff08;混合效应&#xff09;模型的选择策略 1&#xff09;科学研究中数据及其复杂性 2&#xff09;回归分析历史…

学习笔记:MySQL(day1)

DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09;是 SQL 语言的一部分&#xff0c;用于定义和管理数据库中的数据结构&#xff0c;包括创建、修改、删除数据库对象&#xff08;如数据库、表、视图、索引等&#xff09;。常见的 DDL 语句及其功能&…

C++ 模板初阶:从函数重载到泛型编程的优雅过渡

&#x1f525;个人主页&#xff1a;爱和冰阔乐 &#x1f4da;专栏传送门&#xff1a;《数据结构与算法》 、C &#x1f436;学习方向&#xff1a;C方向学习爱好者 ⭐人生格言&#xff1a;得知坦然 &#xff0c;失之淡然 文章目录前言一、引言&#xff1a;函数重载的痛点与模板…

从零开始的python学习——语句

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;python学习专栏&#xff1b; 文章目录 前言 一、顺序语句 二、条件语句 2.1、什么是条件语句 2.2、语法格式 2.3、缩进和代码…

Python基础之元组列表集合字典

目录一、元组&#xff08;Turple&#xff09;1.1、概念定义注意事项1.2、常见操作元组只支持查询操作&#xff0c;不支持增删改操作。查询元素二、列表1.1、概念定义注意事项1.2、常见操作添加修改查找删除排序列表推导式列表嵌套三、集合1.1、概念定义集合的特点1.2、常见操作…

Ubuntu 22.04 安装 向日葵远程Client端

通过向日葵主页的下载deb包有可能遇到安装失败的情况 #因向向日葵提供的libwebkit包是4.0-37了,而向日葵依赖的是3.0.0(Reading database ... 303666 files and directories currently installed.) Preparing to unpack SunloginClient-10.1.1.38139_amd64.deb.1 ... sunloginc…

Linux中卸载和安装Nginx

阿里云宝塔linux为例一&#xff1a;卸载1.停止 Nginx 服务# 检查Nginx运行状态 systemctl status nginx# 停止Nginx服务 sudo systemctl stop nginx# 禁用开机自启 sudo systemctl disable nginx2. 卸载 Nginx 软件包# 查看已安装的Nginx包 yum list installed | grep nginx# 卸…

C++知识汇总(5)

目录 1.写在前面 1.C11的发展历史 2.序列表初始化 3&#xff0c;C11中的std::initializer_list 4.左值和右值 1.左值引用和右值引用 2.生命周期的延长 3.左值和右值的参数匹配 4&#xff0c;移动构造和移动赋值 5.引用折叠 6.完美转发 总结 1.可变模板参数 2.包扩展…