開門見山的說,new
操作符可能是大部分JavaScript初學者的噩夢,這篇文章就來簡單詳細地介紹一下使用了new
操作符後,究竟會發生什麼。
先看一段代碼:
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
var member = new Person('Jack', 'Wang');
member.firstName; // "Jack"
member.lastName; // "Wang"
member.__proto__ === Person.prototype; // true
爲什麼會這樣?這就涉及到使用new
操作符後發生的一系列步驟:
第一步
創建一個空的對象:
var member = {};
// 或者
var member = new Object();
這一步很簡單易懂,new
嘛,不用多說。
第二步
member.__proto__ = Person.prototype;
這一步就是進行原型鏈接,將member
的__proto__
鏈接到Person
的原型上。
這也是爲什麼
member.__proto__ === Person.prototype; // true
的值爲true
的原因。
至於原型,不瞭解的移步:繼承與原型鏈
第三步
var that = Person.call(member); // 綁定this並執行
將Person
的this
指向member
,這也是爲什麼member.firstName
和member.lastName
返回的是"Jack"
和"Wang"
的原因。實際的執行過程是這樣的:
function Person(firstName, lastName) {
member.firstName = firstName;
member.lastName = lastName;
}
第四步
判斷Person
函數的返回值:
- 如果是值類型(即基本類型),則丟棄;
- 如果是引用類型,則替換
member
;
Person
函數中若沒有寫return
語句,則默認返回undefined
,屬於基本類型,丟棄。若return
語句返回的是this
,則由於第三步已經對this
指向做了改變,返回的就是member
本身,無所謂替換不替換。
今天有些憨憨,學什麼都學不進去,只好寫篇博客記錄一下備忘了