JavaScript 原型機制詳解:從概念到實戰(附個人學習方法)

原型是 JavaScript 實現繼承與代碼復用的核心機制,也是面試高頻考點。本文結合個人學習經驗、核心概念解析與實戰案例,幫你徹底搞懂原型、prototype__proto__ 及相關知識點,同時分享高效的學習方法。

一、個人學習方法:高效掌握復雜知識點

復雜概念(如原型)的學習,關鍵在“邊輸入邊記錄”和“先模仿后創新”,我的核心方法如下:

1. 邊看教程邊做“雙筆記”

  • 截圖筆記:遇到關鍵代碼(如 prototype 掛載方法)、原型鏈圖示時,立刻截圖并標注核心邏輯(比如在截圖上寫“__proto__ 指向構造函數的 prototype”);
  • 文字筆記:用自己的話總結知識點(比如“new 關鍵字的作用,就是創建一個對象并讓它的 __proto__ 指向構造函數的 prototype”),避免照搬教程話術。
  • 好處:復盤時既能看代碼細節,又能快速回憶自己的理解,比單純看視頻效率高 2 倍以上。

2. 利用碎片化時間,拒絕“無效等待”

很多事情(如視頻加載、代碼運行)存在空隙時間,此時可以:

  • 快速默寫核心公式(如“對象.__proto__ === 構造函數.prototype”);
  • 梳理知識點邏輯(如“先區分普通對象和函數對象,再理解 prototype 的作用”);
  • 注意:如果事情需要全程專注(如調試復雜代碼),則不強行拆分時間,避免打斷思路。

3. 先仿造再創新:入門的“黃金法則”

學習原型這類抽象概念時,先“照抄”老師的代碼(如給 Date 原型加方法),理解每一行的作用后,再做創新修改(如給 Array 原型加“去重方法”)。

  • 示例:先仿造“給 DateshowNowTime 方法”,再創新“給 DateshowTime 方法,支持返回 yyyy-MM-dd HH:mm 格式”。
  • 好處:降低入門難度,避免因“想不出創新點”而放棄,同時在仿造中積累手感。

二、原型核心概念:先理清“3 個基礎問題”

在學原型前,必須先解決 3 個核心問題:區分普通對象與函數對象理解 prototype理解 __proto__

1. 問題 1:如何區分普通對象與函數對象?

JS 中所有值要么是“普通對象”,要么是“函數對象”,兩者的核心區別是:是否有 prototype 屬性(函數對象有,普通對象沒有),常用 typeof 檢測:

類型 定義方式 typeof 結果 是否有 prototype 示例
普通對象 對象字面量、new Object() object var o = {name: 'a'}
函數對象 函數聲明、new Function() function function fn(){}, Date
實戰檢測代碼
// 普通對象:typeof 為 object,無 prototype
var o1 = { name: '詩書畫唱' };
var o2 = new Object();
var arr = [1, 2, 3]; // 數組是特殊的普通對象
console.log(typeof o1); // object(普通對象)
console.log(typeof arr); // object(普通對象)
console.log(o1.prototype); // undefined(普通對象無 prototype)// 函數對象:typeof 為 function,有 prototype
function fn() {}
var Dog = function() {};
console.log(typeof fn); // function(函數對象)
console.log(typeof Date); // function(Date 是內置函數對象)
console.log(fn.prototype); // object(函數對象有 prototype,默認是普通對象)// 特殊例外:Function.prototype 是函數對象(唯一例外)
console.log(typeof Function.prototype); // function(其他函數對象的 prototype 都是 object)

2. 問題 2:prototype 是什么?有什么用?

prototype函數對象特有的屬性,本質是一個“普通對象”(除了 Function.prototype),核心作用是實現代碼復用——給 prototype 加的屬性/方法,所有由該函數構造的對象都能訪問到。

核心特點
  • 只有函數對象有 prototype(普通對象沒有);
  • 函數對象的 prototype 中,默認有 constructor 屬性,指向該函數本身(如 fn.prototype.constructor === fn);
  • 示例:給 Stu 函數的 prototypesex 屬性,所有 new Stu() 創建的對象都能訪問 sex
實戰代碼:prototype 實現代碼復用
// 1. 定義函數對象(構造函數)
function Stu(name) {this.name = name; // 每個對象獨有的屬性(姓名不同)
}// 2. 給 prototype 加“共享屬性/方法”(所有學生都有相同的性別和“學習方法”)
Stu.prototype.sex 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919454.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919454.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919454.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【人工智能】2025年AI代理失控危機:構建安全壁壘,守護智能未來

還在為高昂的AI開發成本發愁?這本書教你如何在個人電腦上引爆DeepSeek的澎湃算力! 在2025年,AI代理(AI Agents)已成為日常生活和企業運營的核心組成部分,它們能夠自主決策、執行任務并與環境互動。然而,隨著AI代理能力的指數級提升,其安全隱患也日益凸顯,包括數據泄露…

從噪聲到動作:Diffusion Policy 如何改變機器人學習?

從噪聲到動作:Diffusion Policy 如何改變機器人學習? 引言 在機器人手臂操作方面一直存在諸多挑戰。我們熟悉的工業場景中的組裝機械臂,往往依賴于寫死的程序指令進行控制,具有高度規范化與高精度的特點。而當機械臂需要在復雜、…

量子計算和超級計算機將徹底改變技術

我們生活在技術時代,但未來仍有無限可能。近年來,各大企業在量子計算領域持續邁出雖小卻關鍵的步伐 —— 這一技術注定將徹底改變我們所熟知的世界。以下精選的潛在應用場景,將對從交通出行到醫療健康的多個領域產生深遠影響。 在由 “1” 和…

Linux 中文顯示空白框(Java)

問題展示:解決方案本系統采用宋體,若是其它字體,可以類似排查Font rewardFirstFont new Font("SimSun", Font.BOLD, 20);linux系統字體-檢查查詢linux系統所有字體fc-list檢查是否有目標字體(SimSun)&#…

普通用戶使用docker命令

參考大佬 https://blog.51cto.com/u_16175448/12082279 詳細步驟及代碼 步驟 1:安裝 Docker 首先,你需要安裝 Docker。 步驟 2:創建 Docker 用戶組 Docker 默認以 root 用戶運行,為了普通用戶能夠使用 Docker,我們需要…

【傳奇開心果系列】Flet框架實現的家庭記賬本示例自定義模板

Flet家庭記賬本示例自定義模板一、效果展示截圖二、Flet家庭記賬本概況介紹三、應用特色1. 簡潔直觀的用戶界面2. 全面的財務管理功能3. 實時數據監控4. 數據可視化分析5. 數據管理功能四、使用場景個人財務管理家庭賬務管理小微企業記賬學生理財教育五、主要功能模塊&#xff…

Node.js 在 Windows Server 上的離線部署方案

Node.js 在 Windows Server 上的離線部署方案 離線部署的核心是提前準備所有依賴資源(避免在線下載),并通過本地配置完成服務搭建,整體分為「依賴準備」「環境配置」「項目部署」「服務注冊」4個階段。 一、提前準備離線資源&am…

SpringAI接入openAI配置出現的問題全解析

SpringAI接入openAI配置出現的四個問題全解析1、無法下載openAI或SpringAI依賴包1.1、思路就是從哪個源下載所需的依賴包1.2、解決思路:我們可以看阿里的中央倉庫是否有集成SpringAI的依賴,從它這里下也是可以的。我們看看阿里云云效maven地址&#xff0…

自然語言處理——02 文本預處理(上)

1 認識文本預處理 概念: 文本語料在輸送給模型前一般需要一系列的預處理工作,才能符合模型輸入的要求;比如:將文本轉化成模型需要的張量、規范張量的尺寸;比如: 關于數據X:數據有沒有臟數據、數…

數據結構:二叉樹的鏈式存儲

用鏈表來表示一棵二叉樹,即用指針指向來指示元素的邏輯關系。通常的方法是鏈表中每個結點由三個域組成,數據域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址 。 我們之前就已經說過,二叉樹是遞歸…

【Spring Boot把日志記錄到文件里面】

<?xml version"1.0" encoding"UTF-8"?> <configuration><!-- 日志輸出格式 --><property name"LOG_PATTERN" value"%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" /><!-- 日志…

大數據服務完全分布式部署- 其他組件(阿里云版)

ZooKeeper 安裝 官網 解壓 cd /export/server/ tar -zxvf /export/server/apache-zookeeper-3.9.3-bin.tar.gz -C /export/server/軟鏈接 ln -s /export/server/apache-zookeeper-3.9.3-bin /export/server/zookeeper配置 cd /export/server/zookeeper/ mkdir zkDatamyid…

Windows 平板/電腦 上使用 DHCPSRV 搭建 DHCP 服務器

一、DHCPSRV 核心優勢 輕量便攜:單文件綠色軟件,無需安裝 全圖形界面:比命令行工具更友好 支持IPv4/IPv6:滿足現代網絡需求 低資源占用:適合平板電腦運行(內存<10MB) 租約管理:可查看實時IP分配情況 二、超詳細配置流程 1. 下載與初始化 官網下載:http://www…

ArcGIS動態表格批量出圖

前言&#xff1a;產品介紹&#xff1a;ArcGIS動態表格擴展模塊Mapping and Charting Solutions&#xff0c;可用于插入動態表格&#xff0c;與數據驅動結合&#xff0c;出圖效率無敵。注&#xff1a;優先選擇arcgis10.2.2。 一、首先是根據自身攜帶的arcgis數據進行下載對應的…

Linux小白加油站,第三周周考

1.如何查看當前系統中所有磁盤設備及其分區結構(如磁盤名稱、大小、掛載點等)? lsblk # 顯示磁盤名稱、大小、掛載點&#xff08;P21&#xff09;2.若需對空閑磁盤(如/dev/sdb)進行交互式劃分&#xff0c;如何進入操作界面并創建一個5GB的主分區(類型為Linux默認文件系統)? …

SEO的紅利沒了,下一個風口叫GEO

一、 搜索在退場&#xff0c;答案在上臺過去二十多年&#xff0c;我們習慣了這樣的路徑&#xff1a;輸入關鍵詞 → 點開一堆藍色鏈接 → 慢慢篩出想要的信息。SEO&#xff08;搜索引擎優化&#xff09;就是圍繞這套游戲規則展開的&#xff0c;誰玩得溜&#xff0c;誰就有流量、…

Kubernetes 的 YAML 配置文件-apiVersion

Kubernetes的YAML配置文件–apiVersion 關于 Kubernetes 的 apiVersion 說明 以及 生產環境中推薦使用的版本 的完整指南,幫助你正確、安全地編寫 Kubernetes 配置文件。 一、什么是 apiVersion? 在 Kubernetes 的 YAML 配置文件中,apiVersion 字段用于指定你所使用的 Kub…

uniapp 5+App項目,在android studio模擬器上運行調試

1.安裝android studio&#xff0c;默認安裝即可 點擊下載android studio 2.安裝完成后&#xff0c;添加設備 選擇機型并下載 啟動模擬機&#xff08;啟動比較慢&#xff0c;稍等一會即可&#xff09; 3.等待模擬器啟動后&#xff0c;在uniapp上運行項目到模擬器 如果下…

Qt猜數字游戲項目開發教程 - 從零開始構建趣味小游戲

Qt猜數字游戲項目開發教程 - 從零開始構建趣味小游戲 項目概述 本項目是一個基于Qt框架開發的猜數字游戲&#xff0c;具有現代化的UI設計和完整的游戲邏輯。項目采用C語言開發&#xff0c;使用Qt的信號槽機制實現界面交互&#xff0c;通過隨機數生成和狀態管理實現完整的游戲…

初識CNN05——經典網絡認識2

系列文章目錄 初識CNN01——認識CNN 初識CNN02——認識CNN2 初識CNN03——預訓練與遷移學習 初識CNN04——經典網絡認識 文章目錄系列文章目錄一、GoogleNet——Inception1.1 1x1卷積1.2 維度升降1.3 網絡結構1.4 Inception Module1.5 輔助分類器二、ResNet——越深越好2.1 梯…