異步編程與面向對象知識總結

文章目錄

  • 原型鏈關鍵字總結
    • 原型對象: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.包擴展…