從生活場景學透 JavaScript 原型與原型鏈

一、構造函數:以 “人” 為例的對象工廠

1. 生活場景下的構造函數定義

我們以 “人” 為場景創建構造函數,每個人都有姓名、年齡等個性化屬性,也有人類共有的特征:

// 人類構造函數
function Person(name, age) {this.name = name;this.age = age;// 每個人獨特的屬性this.hobby = `喜歡 ${name}的愛好`;
}// 創建兩個人的實例
const person1 = new Person("小明", 20);
const person2 = new Person("小紅", 22);console.log(person1); // Person { name: '小明', age: 20, hobby: '喜歡小明的愛好' }
console.log(person2); // Person { name: '小紅', age: 22, hobby: '喜歡小紅的愛好' }

2. 基礎數據類型的生活類比

以 “水果” 為例理解基礎數據類型的兩種定義方式:

// 定義水果的兩種方式
let fruit1 = "蘋果"; // 字面量方式
let fruit2 = new String("香蕉"); // 構造函數方式console.log(fruit1); // 蘋果
console.log(fruit2); // 香蕉

二、原型(prototype):提取人類共同特征

1. 提取人類共同屬性到原型

人類共有的屬性(如物種、默認行為)適合放在原型上:

// 優化:將人類共同屬性放到原型上
Person.prototype.species = "智人";
Person.prototype.gender = "默認未知";
Person.prototype.speak = function() {return `${this.name}說:你好!`;
};function Person(name, age) {this.name = name;this.age = age;this.hobby = `喜歡 ${name}的愛好`;
}const person1 = new Person("小明", 20);
const person2 = new Person("小紅", 22);// 訪問原型上的屬性
console.log(person1.species); // 智人
console.log(person2.speak()); // 小紅說:你好!
console.log(person1); // Person { name: '小明', age: 20, hobby: '喜歡小明的愛好' }

2. 原型屬性的不可修改性演示

嘗試修改原型屬性,觀察實例的變化:

// 原型屬性不可修改的演示
Person.prototype.species = "智人";
Person.prototype.speak = function() {return `${this.name}說:你好!`;
};function Person(name, age) {this.name = name;this.age = age;
}const person = new Person("小明", 20);console.log(person.species); // 智人
// 嘗試修改原型屬性
person.species = "外星人";
console.log(person.species); // 外星人(實例自身添加了屬性)
console.log(Person.prototype.species); // 智人(原型屬性未改變)

三、對象原型(proto):隱式鏈接的生活比喻

1. 隱式原型的鏈接關系

以 “動物” 為例說明隱式原型的指向關系:

// 動物構造函數
function Animal() {}
Animal.prototype.eat = function() {return "正在進食";
};// 狗構造函數
function Dog(name) {this.name = name;
}
// 狗的原型指向動物的原型
Dog.prototype = new Animal();const dog = new Dog("旺財");// 驗證隱式原型關系
console.log(dog.__proto__ === Dog.prototype); // true
console.log(Dog.prototype.__proto__ === Animal.prototype); // true
console.log(dog.eat()); // 正在進食(通過原型鏈調用)

2. 隱式原型的查找機制

通過 “學生” 對象演示屬性查找過程:

// 學生構造函數
function Student(name) {this.name = name;
}// 學生原型添加屬性
Student.prototype.school = "默認學校";
Student.prototype.study = function() {return `${this.name}在學習`;
};const student = new Student("小李");// 查找屬性的過程
console.log(student.name); // 小李(自身屬性)
console.log(student.school); // 默認學校(原型屬性)
console.log(student.study()); // 小李在學習(原型方法)

四、this 的原理:從 “創建房屋” 理解 new 操作

1. 房屋構造函數中的 this

模擬房屋建造過程,理解 this 在構造函數中的作用:

// 房屋構造函數
function House(owner, area) {this.owner = owner;this.area = area;this.roomCount = 3; // 默認3個房間// 這里隱含了new的執行過程// 1. 創建空對象 obj = {}// 2. this指向obj// 3. 執行屬性賦值// 4. obj.__proto__ = House.prototype// 5. 返回obj
}House.prototype.address = "未知地址";
House.prototype.showInfo = function() {return `${this.owner}的房子,面積 ${this.area}㎡,位于 ${this.address}`;
};const myHouse = new House("張三", 120);
console.log(myHouse.showInfo()); // 張三的房子,面積120㎡,位于未知地址

五、原型鏈:從 “交通工具” 看對象繼承關系

1. 交通工具的原型鏈結構

通過交通工具的層級關系展示原型鏈:

// 交通工具基類
function Vehicle() {this.type = "交通工具";
}
Vehicle.prototype.move = function() {return "正在移動";
};// 汽車類
function Car(brand) {this.brand = brand;
}
Car.prototype = new Vehicle();
Car.prototype.drive = function() {return `${this.brand}汽車在行駛`;
};// 電動車類
function ElectricCar(brand, battery) {Car.call(this, brand);this.battery = battery;
}
ElectricCar.prototype = new Car("默認品牌");
ElectricCar.prototype.charge = function() {return `正在給 ${this.brand}電動車充電`;
};// 創建電動車實例
const car = new ElectricCar("特斯拉", "鋰電池");// 原型鏈查找演示
console.log(car.brand); // 特斯拉(自身屬性)
console.log(car.drive()); // 特斯拉汽車在行駛(Car原型方法)
console.log(car.move()); // 正在移動(Vehicle原型方法)
console.log(car.charge()); // 正在給特斯拉電動車充電(自身方法)

2. 原型鏈的根對象演示

通過 Object.create 創建特殊對象:

// 普通對象
const normalObj = new Object();
console.log(normalObj.__proto__); // Object.prototype// 使用Object.create創建無原型的對象
const specialObj = Object.create(null);
console.log(specialObj.__proto__); // undefined// 驗證原型鏈終點
console.log(Object.prototype.__proto__); // null

六、生活場景總結表

概念生活類比代碼
構造函數工廠生產線首字母大寫,用 new 創建實例
原型 (prototype)人類共同特征手冊存放同類對象的公共屬性和方法
隱式原型 (proto)家族族譜實例指向構造函數的原型
原型鏈生物進化樹多層繼承關系形成的屬性查找鏈路
this工廠中的施工圖紙指向新創建的對象實例

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

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

相關文章

學c++ cpp 可以投遞哪些崗位

此次描述知識針對應屆生來說哈,如果是社招,更多是對于你目前從事的方向,技術棧進行招聘就好了。 此次編寫是按照boss上崗位篩選的方式進行編寫的,其實投簡歷一般也是用boss,后面也會出一篇文章給大家介紹一般找工作都用…

【Docker基礎】Docker鏡像管理:docker rmi、prune詳解

目錄 引言 1 Docker鏡像管理概述 1.1 為什么需要鏡像清理? 1.2 鏡像生命周期管理 2 docker rmi命令詳解 2.1 基本語法 2.2 常用選項 2.3 刪除單個鏡像 2.4 刪除多個鏡像 2.5 強制刪除鏡像 2.6 刪除所有鏡像 3 docker rmi工作原理 3.1 鏡像刪除流程 3.…

57-Oracle SQL Profile(23ai)實操

在上一期中說到了SQL Tuning Advisor其中一個影響對象就是SQL Profile,同樣在管理和應用開發中,SQL性能優化是個任重道遠的工作,低效的SQL語句讓應用響應緩慢,用戶整體體驗下降,拖垮搞蹦整個系統都有可能。Oracle數據庫提供了多種組合工具,有…

man的使用

man的使用 文章目錄 man的使用基本用法:常見 man 命令操作:man 命令的章節:示例: man 是 Linux 和 macOS 系統中的命令,用于查看命令和程序的手冊頁(manual pages)。手冊頁包含了關于命令、函…

【藍牙】手機連接Linux系統藍牙配對,Linux Qt5分享PDF到手機

要實現手機連接 A40i Linux 系統并通過藍牙接收 PDF 文件,可以按照以下步驟操作: 1. 配置 Linux 藍牙功能 確保開發板上的藍牙模塊已正確驅動并支持藍牙協議棧。 安裝藍牙工具: bash sudo apt install bluetooth bluez bluez-tools 啟動藍…

1432. 改變一個整數能得到的最大差值

1432. 改變一個整數能得到的最大差值 題目鏈接&#xff1a;1432. 改變一個整數能得到的最大差值 代碼如下&#xff1a; class Solution { public:int maxDiff(int num) {string s to_string(num);function<int(char, char)> replace_stoi [&](char old_char, cha…

解密 Spring MVC:從 Tomcat 到 Controller 的一次完整請求之旅

今天&#xff0c;想和你聊一個我們每天都在打交道&#xff0c;但可能不曾深入思考的話題&#xff1a;當一個 HTTP 請求從瀏覽器發出&#xff0c;到最終被我們的 Spring Controller 處理&#xff0c;它到底經歷了一場怎樣的旅程&#xff1f; 理解這個流程&#xff0c;不僅僅是為…

在 Java 中操作 Map時,高效遍歷和安全刪除數據

在 Java 中操作 Map 時&#xff0c;高效遍歷和安全刪除數據可以通過以下方式實現&#xff1a; 一、遍歷 Map 的 4 種高效方式 1. 傳統迭代器&#xff08;Iterator&#xff09; Map<String, Integer> map new HashMap<>(); map.put("key1", 5); map.pu…

力扣-136.只出現一次的數字

題目描述 給你一個 非空 整數數組 nums &#xff0c;除了某個元素只出現一次以外&#xff0c;其余每個元素均出現兩次。找出那個只出現了一次的元素。 你必須設計并實現線性時間復雜度的算法來解決此問題&#xff0c;且該算法只使用常量額外空間。 class Solution {public i…

Go 網絡編程:HTTP服務與客戶端開發

Go 在標準庫中內置了功能強大的 net/http 包&#xff0c;可快速構建高并發、高性能的 HTTP 服務&#xff0c;廣泛應用于微服務、Web后端、API中間層等場景。 一、快速創建一個HTTP服務 示例&#xff1a;最簡Hello服務 package mainimport ("fmt""net/http&quo…

【Prism】 實現注入的幾個標準化步驟(相機舉例)

?? Prism 架構中如何優雅地注冊和注入相機服務 在開發基于 Prism + WPF 的應用時,合理使用依賴注入(DI)可以大大提高系統的可維護性和擴展性。本文以一個多相機平臺管理系統為例,展示如何通過接口、枚舉、容器注冊等方式,實現相機服務的靈活配置與使用。 ?? 一、定義…

vue3組件式開發示例

1&#xff0c;定義組件&#xff08;根據實際調整提交分析結果方法&#xff09; <template><!-- 分析結果上傳對話框組件 --><el-dialogv-model"uploadResultDialog":title"title":width"width":before-close"handleBeforeC…

基于arm linux的bluealsa開啟藍牙A2DP和SCO錄音功能

bluealsa的軟件架構 #mermaid-svg-ohITacCRHItwRR1t {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ohITacCRHItwRR1t .error-icon{fill:#552222;}#mermaid-svg-ohITacCRHItwRR1t .error-text{fill:#552222;stroke:…

網頁后端開發(基礎3--Springboot框架)

web的服務器資源&#xff1a; 靜態資源&#xff1a;服務器上存儲的不會改變的數據&#xff0c;通常不會根據用戶的請求而變化。比如&#xff1a;HTML、CSS、JS、圖片、視頻等&#xff08;負責頁面展示&#xff09; 動態資源&#xff1a;服務器端根據用戶請求和其他數據…

ROS通過urdf_to_graphiz對urdf和xacro文件進行結構可視化

對機器人的urdf文件進行結構可視化&#xff1a; 舉例命令如下&#xff1a; urdf_to_graphiz go2_description.urdf 輸出 .gv 和 .pdf文件&#xff0c;打開 pdf文件如圖&#xff1a;

基于Uniapp+PHP的教育培訓系統開發指南:網校源碼實戰剖析

在線教育日益普及的今天&#xff0c;如何快速搭建一個功能完善、體驗良好的教育培訓系統&#xff0c;成為眾多教育機構、培訓企業、個體講師關注的焦點。與其從零開發&#xff0c;不如基于成熟框架快速部署。而UniappPHP正是當前“低成本高效率”開發網校系統的黃金組合。 本文…

鍵盤 AK35I Pro V2 分析

文章目錄 AK35I Pro V21. MCU SN32F299SN32F299 內存映射 2. Bootloader3. TFT 135x240 1.14inch4. 鍵盤5. Flash PY25Q128HA6. 藍牙 CH582F7. 擴展板8. 電池 606090 3.7V 4000mAh AK35I Pro V2 AK35I Pro V2 測評視頻 鍵盤外殼使用卡扣固定, 外殼沒有螺絲, 將外框向外翹起, 用…

11. TypeScript 工具類型

TypeScript 提供了一系列內置的“工具類型”&#xff08;Utility Types&#xff09;&#xff0c;它們是對已有類型進行變換的便捷方式。通過這些工具類型&#xff0c;開發者可以更靈活、可維護地進行類型設計&#xff0c;避免重復定義類型邏輯。 工具類型的作用主要有&#xf…

Kafka性能調優全攻略:從JVM參數到系統優化

前言 在大數據處理領域&#xff0c;Kafka以其高吞吐、高并發的特性成為消息隊列的首選。然而&#xff0c;隨著業務規模的擴大和數據量的激增&#xff0c;若配置不當&#xff0c;Kafka的性能和穩定性會受到嚴重影響。其中&#xff0c;JVM參數的調整是優化Kafka性能的關鍵一環&a…

HarmonyOS 5 NPU支持哪些AI框架?

以下是HarmonyOS 5 NPU支持的AI框架及適配方案&#xff0c;結合關鍵技術和實測數據&#xff1a; 一、原生支持框架 MindSpore Lite? ?核心特性?&#xff1a; 原生適配昇騰達芬奇架構&#xff0c;支持INT8/FP16混合量化自動算子融合優化&#xff08;實測推理速度提升3.2倍…