在js中建立的每個函式都有乙個(prototype)原型屬性,這個屬性是乙個物件。按字面意思,prototype是通過呼叫構造方法而建立的那個物件的原型物件。
原型模式
function person()
person.prototype.name='mike';
person.prototype.age=21;
person.prototype.sayname=function();
let person1=new person();
person1.sayname();//mike
建立新函式->自動為該函式建立乙個prototype屬性->自動獲得constructor(建構函式)屬性,這個屬性包含乙個指向prototype所在函式的指標
person.prototype.constructor指向person
呼叫建構函式建立新例項後,例項的內部包含乙個內部屬性,指向建構函式的原型屬性之間(在很多實現中,這個內部屬性的名字是_proto_)該連線存在於例項與建構函式的原型之間,而不是例項與建構函式之間。
如果物件的_proto_指向呼叫isprototypeof()方法的物件,則返回true
alert(person.prototype.isprototypeof(person1));//true
~當為物件例項新增乙個屬性時,這個屬性會遮蔽原型物件中儲存的同名屬性(delete操作符可以完全刪除例項屬性)
檢測屬性是存在於例項中還是原型中
alert(person1.hasownprotperty('name'));//false,name是原型屬性
function hasprototypeproperty(object,name)//這個函式可以確定該屬性存在於物件中還是存在於原型中
在上面的原型模式中,每新增乙個屬性和方法就得敲一遍person.prototype.於是有下面這種
function person()
person.prototype=
};
這種語法本質上重寫了預設的prototype物件,因此constructor屬性變成了新物件的constructor屬性(指向object建構函式),不再指向person函式
function person()
let person1=new person();
person.prototype.sayname=function();
person1.sayname();//mike
即使person1例項是在新增新方法之前建立的,但依然可以訪問
但是如果重寫了原型物件,就不可以了
function person()
let person1=new person();
person.prototype=
};person1.sayname();/error
重寫原型物件會切斷現有原型與任何之前存在的物件例項之間的聯絡,它們引用的仍然是最初的原型 JS原型鏈的一些理解
關於原型鏈我的理解是乙個建構函式的原型作為另乙個建構函式的例項形成的繼承關係 在js高階程式設計中有這樣乙個圖 當我們定義乙個函式時會有乙個原型,即圖中的supertype prototype,這時原型物件中會有乙個constructor指向建構函式supertype,這便是建構函式與原型物件之間的...
一些原型的理解 2
函式的prototype屬性 給原型物件新增屬性 一般都是方法 函式的prototype屬性 在定義函式時自動新增的,預設值是乙個空object物件 物件的 proto 屬性 建立物件時自動新增的,預設值為建構函式的prototype屬性值 所有函式都是function的例項 包含function自...
js中關於this的指向和js原型的一些經驗
通過以下例子來觀察this的指向,以及得出的結論 console.log this function test this.f2 function fun this.f3 fun this.f4 test fun 通過new test函式 例項乙個test物件 js物件都是由函式構建的 此例的當前物件...