1. 程式人生 > 其它 >js-原型、原型鏈

js-原型、原型鏈

function Person(){}; var person=new Person(); person.name="cola"; console.log(person.name);//cola http://c.biancheng.net/view/5805.html (一) 原型prototype 一原型prototype 1.js中每個函式都有一個prototype屬性 (1)這個屬性它指向一個物件,就是指向例項的原型 function Person(){} Person.prototype.name='cola'; var person1=new Person() console.log(person.name);//cola 即 建構函式的prototype屬性指向原型物件 (2)原型:每一個js物件除了null之外的一個js物件 (3)每一個例項物件都會從原型繼承這些屬性 4.原型屬性將會影響所有例項物件,修改任何原型屬性值,則該建構函式的所有例項都會看到這種變化,這樣就省去了私有屬性修改的麻煩。 二 _proto_屬性 1.每個js物件除了null外都具有的一個屬性,這個屬性指向物件的原型 2.例項物件的_proto_屬性指向原型 三constructor 每個原型都有一個constructor屬性,指向關聯的建構函式 是一個私有屬性 (二)原型鏈 一 原型鏈 就是原型的原型。 eg: person1._proto_._proto_ 1.原型物件就是一個物件。 物件由object建構函式建立的 new Object() 則_proto_會指向Object.prototype 1.宣告建構函式,原型物件,new他(例項),就是原型鏈
每個函式建立時都會被賦予prototype屬性,它指向函式的原型物件,所有的原型物件都會新增一個constructor屬性,指向建構函式 當new一個例項時,例項有一個_proto_屬性,指向建構函式的原型物件 因此_proto_屬性可以看做一個連線例項和建構函式的原型物件的橋樑 2. 在 JavaScript 中,例項物件在讀取屬性時總是先檢查私有屬性。如果存在,則會返回私有屬性值;否則就會檢索 prototype 原型;如果找到同名屬性,則返回 prototype 原型的屬性值。 prototype 原型允許引用其他物件。如果在 prototype 原型中沒有找到指定的屬性,則 JavaScript 將會根據引用關係,繼續檢索 prototype 原型物件的 prototype 原型,以此類推。 1. function a (x) { //建構函式a
2. this.x = x; 3. } 4. a.prototype.x = 0; //原型屬性x的值為0 5. function b (x) { //建構函式b 6. this.x = x; 7. } 8. b.prototype = new a (1); //原型物件為建構函式a的例項 9. function c (x) { //建構函式c 10. this.x = x; 11. } 12. c.prototype = new b (2); //原型物件為建構函式b的例項 13. var d = new c (3); //例項化建構函式c 14. console.log(d.x); //呼叫例項物件d的屬性x,返回值為3
15. delete d.x; //刪除例項物件的私有屬性x 16. console.log(d.x); //呼叫例項物件d的屬性x,返回值為2 17. delete c.prototype.x; //刪除c類的原型屬性x 18. console.log(d.x); //呼叫例項物件d的屬性x,返回值為1 19. delete b.prototype.x; //刪除b類的原型屬性x 20. console.log(d.x); //呼叫例項物件d的屬性x,返回值為0 21. delete a.prototype.x; //刪除a類的原型屬性x 22. console.log(d.x); //呼叫例項物件d的屬性x,返回值為undefined 5.例項屬性的讀取順序 先在例項本身去找指定的屬性,找到則返回值,如果沒找到,則沿著原型物件尋找 二 原型規則 1. 所有的引用型別(陣列arr[ ]、物件obj { }、函式fn() { } ),都具有物件特性,都可以自由擴充套件屬性。null除外。 var arr=[ ]; arrj.a=100 三 instanceof 物件 instanceof 建構函式 用於判斷引用型別屬於哪個建構函式。 eg: console.log(p instanceof Person); (三) 原型繼承 1. 在原型繼承中,類和例項概念被淡化了,一切都從物件的角度來考慮 JavaScript 能夠根據原型鏈來查詢物件之間的這種繼承關係。 1. function A (x) { //A類 2. this.x1 = x; //A的私有屬性x1 3. this.get1 = function () { //A的私有方法get1() 4. return this.x1; 5. }; 6. } 7. function B(x) { //B類 8. this.x2 = x; //B的私有屬性x2 9. this.get2 = function () { //B的私有方法get2() 10. return this.x2 + this.x2; 11. }; 12. } 13. B.prototype = new A (1); //原型物件繼承A的例項 14. function C (x) { //C類 15. this.x3 = x; //C的私有屬性x3 16. this.get3 = function () { //C的私有方法get3() 17. return this.x3 * this.x3; 18. }; 19. } 20. C.prototype = new B (2); //原型物件繼承B的例項 1. var b = new B (2); //例項化B 2. var c = new C (3); //例項化C 3. console.log(b.x1); //在例項物件b中呼叫A的屬性x1,返回1 4. console.log(c.x1); //在例項物件c中呼叫A的屬性x1,返回1 5. console.log(c.get3()); //在例項物件c中呼叫C的方法get3(),返回9 6. console.log(c.get2()); //在例項物件c中呼叫B的方法get2(),返回4 (四)js的垃圾回收機制GC 當一個物件沒有任何的變數或屬性對它進行引用時,此時我們將永遠無法操作該物件,此時這種物件就是一個垃圾,這種物件過多會佔用大量的記憶體空間,導致程式執行變慢,所以這種垃圾必須進行清理。 即 , 如果堆記憶體中的物件,沒有任何變數指向它時,這個堆記憶體裡的物件就會成為垃圾。 JS擁有自動的垃圾回收機制,會自動將這些垃圾物件從記憶體中銷燬。 如果你不再使用該物件,那麼,將改物件的引用設定為 null 即可。

本文來自部落格園,作者:mdj今天又過關了,轉載請註明原文連結:https://www.cnblogs.com/mhhh/p/15670908.html