js建構函式建立物件加new與不加new的問題

2021-09-14 03:27:58 字數 1324 閱讀 6870

今天看到這樣一道題:

填寫"to do"處的內容讓下面**支援a.name = "name1"; b.name = "name2";
function obj(name)

obj. /* to do */ = "name2";

var a = obj("name1");

var b = new obj;

問題1:new操作符做了些什麼呢?

建立乙個新物件;

將建構函式的作用域賦給新物件(因此 this 就指向了這個新物件) ;

執行建構函式中的**(為這個新物件新增屬性) ;

返回新物件。

問題2:不加new操作符直接執行建構函式會發生什呢?

function obj(name)

var a = obj("name1");

console.log(a); // 結果 => undefined

哦,原來只是當作正常的函式呼叫來執行,obj沒有返回值,故aundefined

兩者區別總結

使用new操作符建立物件,並且建構函式沒有返回值或者返回為基本資料型別,那麼返回該物件,如下例:

function obj(name)

var b = new obj;

console.log(b); // obj

function obj(name)

var b = new obj;

console.log(b); // 同上

如果建構函式返回乙個引用型別

function obj(name);

}var b = new obj;

console.log(b); // {}

總結

對於不加new來執行建構函式來說,返回值就是建構函式的執行結果;對於加new關鍵字來執行建構函式而言,如果return的是基本資料型別,那麼忽視掉該return值,如果返回的是乙個引用型別,那麼返回該引用型別。

那麼問題答案你有了嗎?

function obj(name)

obj.prototype.name = "name2";

var a = obj("name1");

var b = new obj;

new 等於 malloc加建構函式

1 new 是c 中的操作符,malloc是c 中的乙個函式 2 new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的析構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫析構函式 3 記憶體洩漏對於malloc或者new都可以檢查出來的,...

JS 建構函式 原型 new

1 每個函式都有乙個prototype屬性,該屬性指向函式的原型物件,原型物件的用途是可以讓所有物件例項共享它所包含的屬性和方法。2 預設情況下,每個原型物件都會自動獲得乙個constructor屬性,該屬性指向prototype屬性所在的函式。constructor屬性最初是用來標識物件型別的,但...

new與建構函式

function cat name,age 機制1 每乙個函式物件都有乙個prototype物件 console.log cat.prototype node輸出 cat.prototype.get name function 機制2 new關鍵字 建構函式 step1 建立了乙個新的物件 該物件預...