一、什么是new?
眾所周知,在JS中,new的作用是通過建構式來創建一個實體物件,
像下面這樣:(和普通函式不一樣,當函式用作建構式時,首字母一般要大寫,以作區分,)
function Foo(name) {
this.name = name;
}
console.log("new Foo('mm')的型別:",typeof new Foo('mm')); // object
console.log("Foo的型別:",typeof Foo); // function

二、new經歷了什么程序?
Foo明明只是一個函式,可是為什么new Foo()執行后會突然回傳一個物件呢?
我們從結果出發可以推斷出,既然回傳了一個物件,那么這事肯定和物件有關系,
實際上new幫我們做了這樣幾件事:
- 幫我們創建了一個空物件,例如:obj;
- 將空物件原型的記憶體地址
__proto__指向函式的原型物件;(這里涉及到了原型鏈的知識) - 利用函式的call方法,將原本指向window的系結物件this指向了obj,(這樣一來,當我們向函式中再傳遞實參時,物件的屬性就會被掛載到obj上,)
- 利用函式回傳物件obj,
三、new的程序分析
function Foo(name) {
this.name = name;
return this;
}
var obj = {};
obj.__proto__ = Foo.prototype;
// Foo.call(obj, 'mm');
var foo = Foo.call(obj, 'mm');
console.log(foo);

分析:
首先預編譯,宣告提升,解釋執行,
執行時按照順序來進行,
- obj指向空物件;
- obj的原型地址指向建構式Foo的原型物件;
- 執行
Foo.call(obj, 'mm');this.name = name;通過函式的call方法將this系結到obj(也就是說this就是obj),實參mm傳入建構式Foo中,這樣this.name = 'mm',那么obj.name = 'mm',也就是說name屬性被掛載到obj物件上,return this;就是return obj,這樣obj這個物件就被回傳出來了,
- 將結果賦值給變數foo,
- 列印結果,

四、總結
第三部分的代碼直接用new 建構式效果是相同的,
function Foo(name) {
this.name = name;
}
var foo = new Foo('mm');
console.log(foo);

簡而言之,new運算子幫我們做了四件事:
- 創建空物件;
- 空物件的原型指標指向建構式的原型物件;
- 利用函式的call方法改變this指向,在空物件上掛載屬性或方法;
- 回傳物件,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/104009.html
標籤:JavaScript
