原型和原型鏈 湯姆大叔

2022-06-25 19:18:11 字數 1436 閱讀 9032

1

function foo()

4 foo.prototype =6};

78function bar() {}910

//設定bar的prototype屬性為foo的例項物件

11 bar.prototype = new

foo();

12 bar.prototype.foo = '

hello world';

1314

//修正bar.prototype.constructor為bar本身

15 bar.prototype.constructor =bar;

1617

var test = new bar() //

建立bar的乙個新例項

1819

//原型鏈

20test [bar的例項]

21bar.prototype [foo的例項]

22

23foo.prototype24;

25object.prototype

26 ;

一開始,bar是乙個非常簡單的函式。

之後:建立乙個foo函式的例項;

為bar指定原型;

在其原型上定義乙個屬性;

使得原型物件的constructor屬性指向bar;

到此為止,bar由最開始的那個簡單的函式變成了:

一:原型物件發生改變,原始bar本來就有原型物件,現在又為它指定了另乙個物件而已。

二:這個充當bar原型的東東,本身是foo的例項,現在它發生了改變,一來多了個foo屬性,二來它的constructor屬性指向了bar。

現在的bar作為建構函式,建立了test例項。

先給bar的原型物件起個名字吧,叫bp。

test作為乙個物件,擁有_proto_屬性,此屬性的指向和建構函式bar的prototype屬性的指向是一模一樣的。

而「萬夫所指」的那個被叫做原型物件的東東,已經有名字啦,就是bp。

回到bp

bp是建構函式foo的乙個例項。

那麼bp是什麼?

一:bp是foo的例項

二:bp中的_proto_屬性,和建構函式foo中的prototype屬性的指向一樣,是屬於foo的原型物件,名叫fp

到此為止,一切都明了。

foo的原型物件是fp,

bar的原型物件是bp,

test的原型物件,就是bar的原型物件bp。

bp是乙個活生生的物件,它的原型物件就是fp。

故而:test的原型物件是bp

bp的原型物件是fp。

正好應了阮一峰老師說的那樣:

每乙個物件都有自己的原型,

每乙個原型都是物件,也擁有自己的原型。

建構函式的各個例項,共享建構函式原型物件。

定義一次,用到多次?

原型 和 原型鏈

每乙個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乙個物件的過程 建立乙...