一.前言
假如我們創建了一個物件,只有一個成員變數name,
let ss = {
name: 'shucheng',
}
console.log(ss);
結果如下:可以看出該物件有很多原型方法
通過上面的鋪墊,我們知道::::::::::::::::::::::
JavaScript 的每個物件都繼承另一個父級物件,父級物件稱為原型 (prototype)物件,原型也是一個物件,原型物件上的所有屬性和方法,都能被子物件 (派生物件) 共享,通過建構式生成實體物件 時,會自動為實體物件分配原型物件,
而每一個建構式都有一個prototype屬性,這個屬性就是實體物件的原型物件,

上圖就可以明了的證明建構式和原型物件之間的關系,那么我們再來看實體和原型物件的關系,依照上面的關系圖,實體的內部指標 proto 指向原型物件,建構式的原型也指向同一個原型物件,
對于原型的理解如下:
(1)所有的參考型別(包括陣列,物件,函式)都有隱性原型屬性(_proto_), 值也是一個普通的物件,(見上圖,可以看出原型物件就是灰色的部分,其里面的屬性值也是可以訪問的,)
(2)所有的函式,都有一個 prototype 屬性,值也是一個普通的物件,
(3)所有的參考型別的proto屬性值都指向建構式的 prototype 屬性值,
要理解原型就要明白建構式、實體物件、原型之間的關系,我用一張圖來表示出他們之間的關系,如下圖所示:
建構式new出來一個物件,而每個物件都有一個constructor屬性,該屬性指向創建該實體的建構式,建構式的prototype屬性是這個new出來的實體化物件的原型,實體物件通過__proto__或者object.getPrototype的方法獲取原型,轉化關系實體如下圖所示


2.1.原型鏈
那么明白了三者之間的關系我們就來說一下原型鏈,從一個實體物件向上找有一個構造實體的原型物件,這個原型物件又有構造它的上一級原型物件,如此一級一級的關系鏈,就構成了原型鏈,原型鏈的最頂端就是Object.prototype ;
原型鏈的形成就是物件的屬性和方法,有可能是定義在自身內的,也有可能會定義他的原型物件上,由于原型本身也是物件,又有了自己的原型,所以就會形成,
總的來說它是實作繼承的主要方法,基本思想就是利用原型讓一個參考型別繼承另一個參考型別的屬性和方法,
二.原型鏈的理解實體
function MyTest(name,age){
this.name=name;
this.age=age;}MyTest.prototype={
"constructor":MyTest,
"showName":function(){
console.log(this.name);
},
"showAge":function(){
console.log(this.age);
}}
var newMyTest01=new MyTest('安靜的木馬',18);
代碼中我們通過new構造器MyTest,生成實體化物件newMyTest01,那么newMyTest01就有一個隱形屬性__proto__指向MyTest.prototype原型物件,
①現在訪問newMyTest01.name,因為newMyTest01物件上有name屬性,值為“安靜的木馬”,這個可以直接訪問到
②現在我們訪問newMyTest01.showName方法呢,newMyTest01物件上并沒有直接定義showName方法,訪問不到,然后newMyTest01就會通過__proto__屬性找到MyTest.prototype,也就是MyTest的原型物件,看看能不能訪問到showName方法,現在是可以訪問到了,
③如果MyTest.prototype物件里面也沒有showName方法呢?那就通過MyTest.prototype物件的__proto__繼續找,在原型鏈查找中,一般到Object.prototype.__proto__還查找不到時,就會終止查找,因為ECMA規范里說明Object.prototype.__proto__是原型鏈終點,值為null,而這個時候那個沒有訪問到的屬性值設定為undefined,并不爆出語法錯誤,這是原型鏈查找和作用域鏈查找的一個顯著區別,

本文來自博客園,作者:122www,轉載請注明原文鏈接:https://www.cnblogs.com/131362wsc/p/17106694.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/543464.html
標籤:其他
上一篇:PC移動端面試題
