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