每個函式都有乙個prototype屬性,這個屬性是乙個指標,指向乙個物件,即原型物件。原型物件包含所有例項共享的屬性和方法。使用原型物件可以讓所有例項共享它所包含的方法。
function
person()
person.prototype.name =
"ju"
;person.prototype.
sayname
=function()
;let person1 =
newperson()
;person1.
sayname()
;//ju
let person2 =
newperson()
;person2.
sayname()
;//ju
無論什麼時候,只要建立了乙個新函式,就會根據一組特定的規則建立乙個prototype屬性,這個屬性指向函式的原型物件。在預設情況下,所有原型物件都會自動獲得乙個constructor屬性,這個屬性是乙個指向prototype屬性的指標。以上述**為例,person.prototype.constructor指向person。
建立了自定義的建構函式後,原型物件預設只會含有乙個constructor屬性,而其餘屬性皆繼承自object.
判斷例項與原型物件的關係,可以使用isprototypeof()方法。
let isprototype = person.prototype.
isprototypeof
(person1)
;console.
log(isprototype)
;//true
let isprototype2 = person.prototype.
isprototypeof
(person2)
;console.
log(isprototype2)
;//true
es5中,新增了乙個函式用於返回原型指標(不是原型物件)。
console.
log(object.
getprototypeof
(person1)
.name)
;//'ju'
但是如果在物件例項中新增了乙個同名屬性,這個屬性就會遮蔽原型物件中儲存的同名屬性。換句話說,新增這個屬性只會阻止我們訪問原型中的那個屬性,但是不會修改那個屬性。不過,使用delete操作符則可以完全刪除例項屬性,從而讓我們繼續訪問原型物件中的屬性。
function
person()
person.prototype.name =
"ju"
;person.prototype.
sayname
=function()
;let person1 =
newperson()
;person1.
sayname()
;//ju
person1.name =
"sang"
;// 原型物件中的同名屬性被遮蔽
person1.
sayname()
;//sang
delete person1.name;
// 刪除例項中的同名屬性
person1.
sayname()
;//ju
使用hasownproperty()可以判斷檢測乙個屬性是存在於例項物件中還是原型物件中。
function
person()
person.prototype.name =
"ju"
;person.prototype.
sayname
=function()
;let person1 =
newperson()
;person1.
sayname()
;//ju
console.
log(person1.
hasownproperty
("name"))
;// false
person1.name =
"sang"
;// 原型物件中的同名屬性被遮蔽
person1.
sayname()
;//sang
console.
log(person1.
hasownproperty
("name"))
;// true
delete person1.name;
// 刪除例項中的同名屬性
person1.
sayname()
;//ju
console.
log(person1.
hasownproperty
("name"))
;// false
可以使用in運算判斷乙個例項物件是否具有某個屬性,無論它是原型屬性還是例項屬性。
function
person()
person.prototype.name =
"ju"
;person.prototype.
sayname
=function()
;let person1 =
newperson()
;person1.
sayname()
;console.
log(
"name"
in person1)
;//true
person1.name =
"sang"
;person1.
sayname()
;console.
log(
"name"
in person1)
;//true
delete person1.name;
person1.
sayname()
;console.
log(
"name"
in person1)
;//true
用乙個包含所有屬性和方法的物件字面量來重寫整個原型物件。
function
person()
person.prototype =
};
待續
我們不僅可以操控自定義物件的原型,也可以對原生物件的原型進行修改,但是不推薦。
使用原型模式建立物件時,沒有傳參那一步,所以所有例項物件的屬性都是一樣。最致命的是,如果屬性的值為引用型別時,會引發陣列汙染的問題。
function
person()
person.prototype =};
let person1 =
newperson()
;person1.friends.
push
('dog');
let person2 =
newperson()
;console.
log(person2.friends)
;// ["tom", "jerry", "dog"]
這也是很少有人單獨使用原型模式的原因。 原型與原型鏈
原型有兩種 1為顯示原型,2為隱式原型 1.顯示原型 a prototype b 每個函式都有乙個顯示原型prototype當然函式也有隱式原型 c 原型就是函式的乙個屬性,這個屬性名叫做prototype d 這個屬性即prototype的型別是object 2.隱式原型 a proto b 每個...
原型與原型鏈
圖中一共標了7條線,就一條一條的講,講完了就應該懂了 已知 1.函式是物件,原型也是物件 2.proto 每乙個物件都有,prototype是函式特有的 3.物件的 proto 屬性指向該物件建構函式的 原型 prototype 線1.物件f1的 proto 屬性指向其建構函式的原型 其建構函式 f...
原型與原型鏈
值型別 string,number,boolean,undefined function person var p1 newperson p1即為建構函式person 的例項化物件 var arr 10 20,30 40,50 60 這種語法糖形式的物件建立,是由array 函式建立簡化而來的。這個...