建立的每乙個函式都有乙個prototype
(原型)屬性,這個屬性是乙個物件。而類的建構函式也是函式,只不過它是通過 new 操作符呼叫的,才作為建構函式,所有它也具有原型屬性。預設情況下,所有protoptype屬性都會自動獲得乙個constructor(建構函式)屬性,這個屬性包含乙個指標,指向prototype屬性所在的函式(即建構函式)。原型屬性的作用是為該類的所有例項提供共享的屬性和方法,而建構函式中定義的屬性和方法是某個例項獨有的。通常,我們組合使用建構函式模式和原型模式來建立自定義類。
關於重寫整個原型物件引起的問題:
let person = function重寫原型物件之前:(name,age);
let p = new person("tim",18);
person.prototype =
}p.sayname(); //報錯:sayname()不是乙個函式
重寫原型物件之後:
從圖中可以看到,原型物件都包含乙個指向建構函式的指標,而例項都包含乙個指向原型物件的內部指標_proto_。重寫之後,person類就指向新的原型物件,而例項p還是指向原來的原型物件,原來的原型物件中沒有定義sayname函式。
原型鏈是實現繼承的主要方法,其基本思想是:將子類的原型等於父類的例項,此時作為父類的例項,它擁有_proto_指標指向父類的原型,那麼子類建立的所有例項,都能繼承父類原型中的屬性和方法,從而實現繼承。另外,所有函式的預設原型都是object例項,因此父類的預設原型也會包含乙個內部指標指向object.prototype,這也是所有自定義類都會繼承tostring()、valueof()等預設方法的根本原因。
但僅僅使用原型鏈來實現繼承,也會面臨著同樣的「共享」問題:
因此,通常會借用建構函式來實現組合繼承。
functionsupertype(name)
supertype.prototype.sayname = function
()function
subtype(name,age)
subtype.prototype = new
supertype();
subtype.prototype.sayage = function
()let instance1 = new subtype("tom",18);
instance1.sayname();
instance1.sayage();
let instance2 = new subtype("mike",16);
instance2.sayname();
instance2.sayage();
類式繼承與原型繼承之間的效能差異與原型鏈結構區別
這篇討論下類式繼承與原型繼承之間的效能差異與原型鏈結構區別 我們先開始討論原型鏈結構區別,在前面的兩個章節裡面,分別層現了類式繼承與原型繼承的實現方式。接下來我利用前面2個章節的 來宣告2個物件。原型繼承 var p1 clone person var p2 clone person 類式繼承 va...
JS 繼承 類式 與 原型式
1.類式繼承 先宣告乙個超類 function person name 給這個超類的原型物件上新增方法 getname person.prototype.getname function 例項化這個超 var a new person darren1 console.log a.getname da...
類的建立和繼承,原型鏈
類的建立new乙個function,在這個function的prototype裡面增加屬性和方法。原型繼承 無法給建構函式傳遞引數,改變不了裡面的值 student.prototype new person student.prototype.constructor student 借用建構函式可以...