原型和原型鏈

2021-09-27 11:16:07 字數 3529 閱讀 6329

function

person

(name, age)

,this

.run

=function()

}var person1 =

newperson

('a',18

);var person2 =

newperson

('b',19

)

如果要建立1000個物件,而這1000個物件都有 say 和 run 這兩個個函式,那麼這就出現了明顯的空間記憶體浪費

那麼如果既想這1000個物件都共享 say 和 run 這兩個函式(方法),又不想浪費空間記憶體應該怎麼辦呢

沒錯,那就是原型物件(prototype),有時也將原型物件稱之為原型

物件分為兩種:函式物件和普通物件

所有的函式物件都有乙個屬性:prototype

只有函式物件才有prototype屬性

prototype的是實質乙個物件

這個時候我們就可以將 say 和 run 這兩個方法定義帶到原型物件上,這樣就實現了這兩個方法的共享

person.prototype.name =

'yu'

;function

person()

console.

log(

typeof person.prototype)

;//object

function

person

(name, age)

person.prototype.

say=

function()

person.prototype.

run=

function()

var person1 =

newperson

('a',18

);var person2 =

newperson

('b',19

)person1.

run();

// i can run

但是如果有多個物件的方法要定義到原型物件上時,這樣就會覆蓋建構函式原型物件原來的內容,這樣修改後的原型物件 constructor 就不再指向當前建構函式了

function

person1()

person1.prototype.

say=

function()

person1.prototype.

run=

function()

function

person2()

person2.prototype =

, run:

function()

}var person1_1 =

newperson1()

;var person2_1 =

newperson2()

;console.

log(person1.prototype);//

console.

log(person2.prototype)

//

那麼應該怎麼辦呢?

此時,可以在修改後的原型物件中,新增乙個 constructor 指向原來的建構函式就可以了

隱式原型(proto)和原型物件 (prototype)裡面都有乙個屬性 constructor 屬性

constructor 我們稱為建構函式,因為它指回建構函式本身

function

person()

var person1 =

newperson()

;console.

log(person.prototype.constructor === person)

;

解決上面不指向建構函式的問題

function

person()

person.prototype =

, run:

function()

}var person1 =

newperson()

console.

log(person1.constructor)

;//f person() {}

所有的物件都有乙個__proto__屬性,這個屬性指向建構函式的原型物件

proto和 portotype 是等價的

function

person()

var person =

newperson()

;console.

log(preson.__proto__ === person.protptype)

;//true

我感覺下面的這張圖能很好的詮釋原型和原型鏈之間地關係

圖中藍色的這條線·就是原型連

1.當獲取constructor時,person其實是沒有constructor屬性;

當讀取不到constructor屬性時,會從person的原型也就是person.prototype中獲取,即

person.constructor === person.prototype.constructor
2.通過同一建構函式建立的例項物件的__proto__指向同乙個例項原型

functiona(

)var obj1 =

newa()

;var obj2 =

newa()

;obj1.abc =

123;

obj2.__proto__.bcd =

456;

console.

log(obj1.abc, obj2.abc)

;//123 undefined

console.

log(obj1.__proto__.bcd, obj2.__proto__.bcd)

;//456 456

**

原型 和 原型鏈

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