new 運算子實現原理

2021-10-04 10:36:10 字數 1567 閱讀 5008

方法說明

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 的其...