原型和原型鏈的區分

2021-10-18 23:09:00 字數 2408 閱讀 6476

在前端的面試中經常會被問到關於原型和原型鏈的區別,秉著晚學不如早學的原則,今天特意進行對這個知識點進行了梳理。

function

person

(name)

this

.sleep

=function()

}var person1=

newperson

("小王");

person1.

eat();

//小王吃東西

person1.

sleep()

;//小王睡覺

var person2=

newperson

("小熊");

person2.

eat();

//小熊吃東西

person2.

sleep()

;//小熊睡覺

在上面的這段**中,每乙個例項物件,都有自己的屬性和方法的副本。這不僅無法做到資料共享,也是極大的資源浪費。所以網景公司的工程師brendan eich,考慮到這一點決定為建構函式設定乙個prototype屬性。

function

person

(name)

person.prototype.

eat=

function()

person.prototype.

sleep

=function()

var person1=

newperson

("小王");

person1.

eat();

//小王吃東西

person1.

sleep()

;//小王睡覺

var person2=

newperson

("小熊");

person2.

eat();

//小熊吃東西

person2.

sleep()

;//小熊睡覺

在我們把eat()和sleep()方法新增到person物件的prototype(原型)上之後,在new出來的例項perosn1和person2他們就是公用原型上的方法,這樣就很好的做到了資料共享,節約了記憶體資源。person()建構函式的prototype(原型)屬性是乙個物件,person1例項的__proto__也是乙個物件,之所以在prototype(原型)上定義的方法能在例項上使用也就是因為這兩者的指向相同,都是指向同乙個位址。

圖畫的搓了點,希望大家別介意。上面就是我想表達的原型鏈,通過__proto__屬性一層層往上找,最終null,也就是說在原型鏈上的所有方法我們都是可以使用。換個方法來說也就是如果需要有乙個方法被所有例項呼叫,那麼就可以直接定義在object

// 在obejct 原型上定義乙個clogname函式

object.prototype.

clogname=(

)=>

// 建立乙個str字串,物件可以通過__proto__來訪問原型中的方法

let str=

'***'

str.__proto__ == string.prototype // true

str.__proto__.__proto__.

clogname()

// 輸出 "玩轉js原理!" ,因為str.__proto__.__proto__ 等價於 object.prototype

console.

log(str.__proto__.__proto__.__proto__)

;// 輸出 "null" ,因為str.__proto__.__proto__.__proto__ 等價於 object.__proto__,而object.__proto__是最頂層了沒有原型所以null

//總結:__proto__指向該物件所在的建構函式的原型物件,鏈式呼叫最終一定會返回最頂層null。

原型 和 原型鏈

每乙個js物件 null除外 都和另乙個物件相關聯。另乙個 物件就是我們熟知的原型,每乙個物件都從原型繼承屬性。所有通過物件直接量建立的物件都具有同乙個原型物件,並可以通過js object.prototype 獲得對原型物件的引用。通過關鍵字new和構造函式呼叫建立的物件的原型就是建構函式的 pr...

原型和原型鏈

原型鏈 例項物件與原型之間的連線,叫做原型鏈 function human human.prototype.age 22 var a new human console.log a.age 這裡的age掛載到了human的原型上面了。其實原型就是乙個物件。a為什麼能找到原型上面的物件呢?這裡例項物件...

原型和原型鏈

建構函式 function foo name age function 其實是 var a new object 的語法糖 var a 其實是 var a new array 的語法糖 function foo 其實是 var foo new function 的語法糖 new乙個物件的過程 建立乙...