一文帶你理解JS中的原型和原型鏈
什么是原型?
JavaScript 是一門基于對象的語言,每個對象都有一個原型(prototype),原型是一個對象或 null 值,它定義了該對象所具有的屬性和方法。當(dāng)讀取一個對象的屬性或執(zhí)行一個對象的方法時,如果當(dāng)前對象本身沒有這個屬性或方法,那么 JavaScript 就會從該對象的原型中查找這個屬性或方法,并遞歸查找到其原型鏈上的所有對象,直到找到該屬性或方法為止。
在 JavaScript 中,每個函數(shù)對象都有一個 prototype 屬性,該屬性指向該函數(shù)的原型對象。當(dāng)使用 new 操作符創(chuàng)建一個對象時,該對象的原型就被設(shè)置為構(gòu)造函數(shù)的 prototype 屬性的值。例如:
function Person(name) { this.name = name; } var person1 = new Person("李三"); // person1 的原型是 Person.prototype console.log(person1.__proto__ === Person.prototype); // 輸出:true
什么是原型鏈?
JavaScript 的對象之間不是完全獨立的關(guān)系,它們之間是通過原型鏈(prototype chain)相互關(guān)聯(lián)的。原型鏈指的是對象之間的一種繼承關(guān)系,每個對象都有一個原型對象,而原型對象也可能有自己的原型,這樣一直遞歸下去,就形成了原型鏈。
當(dāng)讀取一個對象的屬性或執(zhí)行一個對象的方法時,如果該對象本身沒有這個屬性或方法,JavaScript 就會沿著該對象的原型鏈向上查找,直到找到該屬性或方法為止。如果到達了原型鏈的頂端還沒有找到該屬性或方法,則返回 undefined。
function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log(`Hello, my name is ${this.name}`); }; function Student(name, grade) { Person.call(this, name); this.grade = grade; } // 繼承了 Person 的屬性和方法 Student.prototype = Object.create(Person.prototype); // 在 Student.prototype 上添加自己的屬性和方法 Student.prototype.study = function() { console.log(`${this.name} is studying in grade ${this.grade}`); }; var student1 = new Student("李三", 3); student1.sayHello(); // 輸出:Hello, my name is 李三 student1.study(); // 輸出:李三 is studying in grade 3
在上面的例子中,我們定義了兩個構(gòu)造函數(shù) Person
和 Student
,并通過 Student.prototype = Object.create(Person.prototype);
實現(xiàn)了 Student
對象繼承自 Person
對象的屬性和方法。當(dāng)我們調(diào)用 student1.sayHello()
方法時,JavaScript 沿著該對象的原型鏈向上查找,找到了 Person.prototype
中的 sayHello()
方法。當(dāng)我們調(diào)用 student1.study()
方法時,則直接在 Student.prototype
中查找到了該方法。
總結(jié)
通過本文的介紹,我們可以明確 JavaScript 中原型和原型鏈的概念以及使用方法。理解原型和原型鏈的設(shè)計思想,可以幫助我們更好地理解 JavaScript 的對象模型,從而更好地編寫高質(zhì)量的代碼
到此這篇關(guān)于一文帶你理解JS中原型和原型鏈的文章就介紹到這了,更多相關(guān)JS原型和原型鏈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
學(xué)習(xí)JavaScript設(shè)計模式(鏈式調(diào)用)
這篇文章主要帶領(lǐng)大家學(xué)習(xí)JavaScript設(shè)計模式,其中重點介紹鏈式調(diào)用,感興趣的小伙伴們可以參考一下2015-11-11JS報錯Uncaught?TypeError:?XXX?is?not?a?function的解決方法
這篇文章主要給大家介紹了關(guān)于JS報錯Uncaught?TypeError:?XXX?is?not?a?function的解決方法,本來好好的,突然就出現(xiàn)的錯誤,不過這并不是什么難解決的錯誤,需要的朋友可以參考下2023-08-08面向JavaScript入門初學(xué)者的二叉搜索樹算法教程
二叉搜索樹則是二叉樹的一種,但它只允許你在左側(cè)節(jié)點儲存比父節(jié)點小的值,右側(cè)只允許儲存比父節(jié)點大的值,這篇文章主要給大家介紹了關(guān)于JavaScript二叉搜索樹算法的相關(guān)資料,需要的朋友可以參考下2021-09-09BOM系列第三篇之定時器應(yīng)用(時鐘、倒計時、秒表和鬧鐘)
這篇文章主要介紹了BOM系列第三篇之定時器應(yīng)用(時鐘、倒計時、秒表和鬧鐘) 的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08JavaScript實現(xiàn)的浮動層框架用法實例分析
這篇文章主要介紹了JavaScript實現(xiàn)的浮動層框架用法,以實例形式分析了JavaScript實現(xiàn)可關(guān)閉的半透明浮動層相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10