今天看到這樣一道題:
填寫"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沒有返回值,故a
是undefined
。
兩者區別總結
使用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 建立了乙個新的物件 該物件預...