1. 程式人生 > 實用技巧 >HashMap原始碼閱讀筆記

HashMap原始碼閱讀筆記

1.2靜態成員和例項成員

1.2.1例項成員

例項成員就是建構函式內部通過this新增的成員 如下列程式碼中uname age sing 就是例項成員,例項成員只能通過例項化的物件來訪問

 function Star(uname, age) {
     this.uname = uname;
     this.age = age;
     this.sing = function() {
     console.log('我會唱歌');
    }
}
var ldh = new Star('劉德華', 18);
console.log(ldh.uname);//例項成員只能通過例項化的物件來訪問

1.2.2靜態成員

靜態成員 在建構函式本身上新增的成員 如下列程式碼中 sex 就是靜態成員,靜態成員只能通過建構函式來訪問

 function Star(uname, age) {
     this.uname = uname;
     this.age = age;
     this.sing = function() {
     console.log('我會唱歌');
    }
}
Star.sex = '男';
var ldh = new Star('劉德華', 18);
console.log(Star.sex);//靜態成員只能通過建構函式來訪問

1.3建構函式的問題

建構函式方法很好用,但是存在浪費記憶體的問題。

1.4建構函式原型prototype

建構函式通過原型分配的函式是所有物件所共享的。

JavaScript 規定,每一個建構函式都有一個prototype 屬性,指向另一個物件。注意這個prototype就是一個物件,這個物件的所有屬性和方法,都會被建構函式所擁有。

我們可以把那些不變的方法,直接定義在 prototype 物件上,這樣所有物件的例項就可以共享這些方法。

function Star(uname, age) {
    this.uname = uname;
    this.age = age;
}
Star.prototype.sing = function() {
	console.log('我會唱歌');
}
var ldh = new Star('劉德華', 18);
var zxy = new Star('張學友', 19);
ldh.sing();//我會唱歌
zxy.sing();//我會唱歌

1.5物件原型

物件都會有一個屬性 __proto__ 指向建構函式的 prototype 原型物件,之所以我們物件可以使用建構函式 prototype 原型物件的屬性和方法,就是因為物件有 __proto__ 原型的存在。
__proto__物件原型和原型物件 prototype 是等價的
__proto__物件原型的意義就在於為物件的查詢機制提供一個方向,或者說一條路線,但是它是一個非標準屬性,因此實際開發中,不可以使用這個屬性,它只是內部指向原型物件 prototype


1.6constructor建構函式

物件原型( __proto__)和建構函式(prototype)原型物件裡面都有一個屬性 constructor 屬性 ,constructor 我們稱為建構函式,因為它指回建構函式本身。
constructor 主要用於記錄該物件引用於哪個建構函式,它可以讓原型物件重新指向原來的建構函式。
一般情況下,物件的方法都在建構函式的原型物件中設定。如果有多個物件的方法,我們可以給原型物件採取物件形式賦值,但是這樣就會覆蓋建構函式原型物件原來的內容,這樣修改後的原型物件 constructor  就不再指向當前構造函數了。此時,我們可以在修改後的原型物件中,新增一個 constructor 指向原來的建構函式。

如果我們修改了原來的原型物件,給原型物件賦值的是一個物件,則必須手動的利用constructor指回原來的建構函式如:

 function Star(uname, age) {
     this.uname = uname;
     this.age = age;
 }
 // 很多情況下,我們需要手動的利用constructor 這個屬性指回 原來的建構函式
 Star.prototype = {
 // 如果我們修改了原來的原型物件,給原型物件賦值的是一個物件,則必須手動的利用constructor指回原來的建構函式
   constructor: Star, // 手動設定指回原來的建構函式
   sing: function() {
     console.log('我會唱歌');
   },
   movie: function() {
     console.log('我會演電影');
   }
}
var zxy = new Star('張學友', 19);
console.log(zxy)

以上程式碼執行結果,設定constructor屬性如圖:

如果未設定constructor屬性,如圖:

1.7原型鏈

多個物件通過--propo--連結起來的關係就是原型鏈

​ 每一個例項物件又有一個__proto__屬性,指向的建構函式的原型物件,建構函式的原型物件也是一個物件,也有__proto__屬性,這樣一層一層往上找就形成了原型鏈。

1.8建構函式例項和原型物件三角關係

1.建構函式的prototype屬性指向了建構函式原型物件
2.例項物件是由建構函式建立的,例項物件的__proto__屬性指向了建構函式的原型物件
3.建構函式的原型物件的constructor屬性指向了建構函式,例項物件的原型的constructor屬性也指向了建構函式

1.9原型鏈和成員的查詢機制

任何物件都有原型物件,也就是prototype屬性,任何原型物件也是一個物件,該物件就有__proto__屬性,這樣一層一層往上找,就形成了一條鏈,我們稱此為原型鏈;

當訪問一個物件的屬性(包括方法)時,首先查詢這個物件自身有沒有該屬性。
如果沒有就查詢它的原型(也就是 __proto__指向的 prototype 原型物件)。
如果還沒有就查詢原型物件的原型(Object的原型物件)。
依此類推一直找到 Object 為止(null)。
__proto__物件原型的意義就在於為物件成員查詢機制提供一個方向,或者說一條路線。

1.10原型物件中this指向

建構函式中的this和原型物件的this,都指向我們new出來的例項物件

function Star(uname, age) {
    this.uname = uname;
    this.age = age;
}
var that;
Star.prototype.sing = function() {
    console.log('我會唱歌');
    that = this;
}
var ldh = new Star('劉德華', 18);
// 1. 在建構函式中,裡面this指向的是物件例項 ldh
console.log(that === ldh);//true
// 2.原型物件函式裡面的this 指向的是 例項物件 ldh