js-原型、原型鏈
阿新 • • 發佈:2021-12-10
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