方法說明
劃重點new
運算子會建立乙個使用者自定義物件型別(就是自定義函式、或者說建構函式)的例項或具有建構函式的內建物件(比如:number、string等原生物件)的例項,具體的過程如下:建立乙個空物件,
{}
將第一步的空物件鏈結到另乙個物件(new
操作符後面跟著的建構函式的原型物件)將第一步建立的物件作為建構函式的
this
上下文返回物件例項,如果建構函式有返回物件,則物件例項就是建構函式返回的物件,否則就返回
this
作為物件例項
從上面的第3步和第4步可以看出來,通過示例**new
操作符建立乙個物件例項時,建構函式中的this
並不一定指向建立出來例項物件,大家可以複製以下 「示例**」 去測試:
// 示例一,建構函式沒有返回物件,this等於建立出來的例項物件
let obj1 =
null
functione1(
)const ins1 =
newe1()
console.
log(obj1 === ins1)
// true
// 示例二,建構函式返回了乙個物件,this不等於建立出來的例項物件
let obj2 =
null
functione2(
)}const ins2 =
newe2()
console.
log(obj2 === ins2)
// false
原始碼點撥
邏輯較為簡單,重點在於理解上面的 「方法說明」 、 「劃重點」、」示例**「 三部分內容,原始碼就是實現 「方法說明」 的乙個過程,通過閉包 + object.create() + function.prototype.call
來實現,具體的可參考**中的詳細注釋
原始碼
const
mynew
=function
(constructor)
}// 示例 1,建構函式無返回值
function
t1(arg1, arg2)
const ins1 =
mynew(t1
)(1,
2)console.
log(ins1)
// // 示例 2,建構函式有返回值
function
t2(arg1, arg2)
}const ins2 =
mynew(t2
)(1,
2)console.
log(ins2)
//
New運算子工作原理
模擬new運算子工作原理的 new1 varnew1 function func,value else m 建構函式 varm function name m.prototype.talk function new 生成的 o1 var o1 newm o1 console.log o1 m o1....
定位new運算子
通常,new 從堆中分配記憶體,但它還有另一種稱為 定位 placement new 運算子,它可以讓我們指定要使用的位置。可以通過這個特性來設定記憶體管 理規程,處理需要通過特定位址進行訪問的硬體或在特定位置建立物件。要使用定位 new 特性,需要包含標頭檔案 new。使用定位 new 運算子時,...
定位 new 運算子
定位 new 運算子 和普通的new 運算子在堆上隨機分配記憶體相比,定位 new 運算子可以在特定的位址位置 定位 new 運算子的具體使用例項 const int buf 512 const int n 5 char buffer buf void part9 newplace 定位new 的其...