網站首頁 編程語言 正文
原型鏈及原型鏈的作用
- 要用原型,先要有構造函數
- 構造函數一創建,系統就自動分配一個原型對象:
Person.prototype
- new一下,即創建一個構造函數的實例對象,每個實例對象被創建的時候,都帶有一個隱式的
__ proto__
指向原型對象
原型鏈
概念:
當實例對象,在自身找不到方法時,會向上一級原型(Person.prototype)對象上查找,如果找不到,又會到原型對象上-級的原型對象(Object.prototype) 上查找,這種鏈試查找機制,就叫原型鏈。
簡單理解
-
每一個對象都有原型,原型也是對象,也有自己的原型,以此類推形成鏈式結構,叫原型鏈
-
當調用實例的某個屬性或方法時,內部會在實例對象p的原型的原型的原型身上一層層查找,找到為止,直到原型鏈終點null
擴展
原型鏈是一條引用的鏈,實例的隱式原型__ proto__
指向構造函數的顯式原型(prototype)
- 可以使用A instanceof B來判斷B是否在A的原型鏈上
原型鏈訪問規則
- 就近原則:對象優先訪問自己的成員,自身沒有,才去原型找,原型也沒有,就往上一級原型找
原型鏈作用
- 實現繼承
- 幾乎所有的框架底層都是用原型鏈實現的繼承
構造函數,原型對象,實例對象的三角關系
1.構造函數
- 創建構造函數
Person
,它有一個porotype
屬性,指向原型對象Person.prototype
(由系統自動創建分配)
2.原型對象
- 原型對象
Person.prototype
, 有一個constructor
屬性,指回構造函數Person ( 構造函數和原型對象互指) - 同時原型對象也是對象,也有一個隱式的
__ proto__
屬性, 指向它自己的原型對象Object.prototype
Object.prototype
也是對象, 也有自己的原型對象,自身同時也有constructor
屬性,指回它的構造函數Object
3.實例對象
- new一下,調用Person構造函數,創建一 個新的實例對象p (p對象包含構造函數Person的所有屬性和方法)
- 每個實例對象創建的時候,都帶有一個隱式的
__ proto__
, 指向它的原型對象 - 原型對象身上又有一個
__ proto__
,又指向上一級原型對象,一級一往上指,形成鏈式查找(原型鏈)
<script>
// 創建一個構造函數Person,Person本身具有原型對象
function Person(name, age) {
this.name = name;
this.age = age;
}
// 給Person的原型對象添加屬性和方法
Person.prototype.sex = 'girl';
Person.prototype.sing = function() {
// Person.prototype.constrctor指向Person構造函數
console.log('唱歌');
}
// 生成一個實例對象xh
// 實例對象的__proto__指向Person.prototype
var xh = new Person('xiaohong', 12, );
// xh本身帶有age屬性,可以直接訪問
console.log(xh.age); //12
// xh本身沒有沒有sing方法,在自身找不到,就去原型Person.prototype身上找
console.log(xh.sing()); //undefined
console.log(xh.hobby); //undefined
console.log(Person.prototype);
// 關系驗證
console.log(xh.__proto__.__proto__ === Object.prototype) //true
console.log(xh.__proto__.__proto__.constructor) //Object
// 原型對象身上的constructor指向的就是Person構造函數
console.log(Person.prototype.constructor === Person) //true
// 原型鏈重點null
console.log(xh.__proto__.__proto__.__proto__) //null
</script>
具體關系如下圖所示:
原文鏈接:https://blog.csdn.net/SH744/article/details/126825431
- 上一篇:ES6數組新增API
- 下一篇:判斷數據類型的五種方法
相關推薦
- 2024-02-25 關于數據庫時間為datetime,前臺出去數據為秒數的解決辦法
- 2022-09-07 Redis?sentinel哨兵集群的實現步驟_Redis
- 2022-12-25 python字典中items()函數用法實例_python
- 2022-04-08 Python?如何實現變量交換_python
- 2022-10-06 修復python-memcached在python3.8環境中報SyntaxWarning的問題(完
- 2023-05-05 Linux中grep命令詳解_linux shell
- 2022-12-29 React點擊事件的兩種寫法小結_React
- 2023-07-22 SpringBoot操作MongoDB時,對同一個字段設置多次條件
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支