一道有意思的筆試題引發的對於new操作符的思考

2021-08-09 14:44:57 字數 1733 閱讀 4917

function

fn1() ;

}function

fn2()

var obj1 = new

fn1();

var obj2 = new

fn2();

console.log(obj1.name, obj2.name);

或許你經常寫物件導向程式設計的**,也熟悉以上**中this的用法甚至是prototype或者原型鏈,但是還是無法解釋上面**的輸出,這時我們不得不承認對new的了解還不是很透徹。

先看一段普通的使用new操作符建立物件的**:

function

person(a, b)

person.prototype.show = function

() ;

var p = new person('hanzichi', 10);

console.log(p);

將console的內容截圖:

我們可以清楚看到,p是乙個物件,並且擁有建構函式person中建立的name和age屬性,還有個__proto__屬性(這貨太特殊,反正不在p的hasownproperty內!),其值為建構函式的prototype屬性值。

其實new操作符建立物件可以分為四個步驟:

建立乙個空物件

將所建立物件的__proto__屬性值設成建構函式的prototype屬性值

執行建構函式中的**,建構函式中的this指向該物件

返回該物件(除非建構函式中返回乙個物件)

用**表示如下:

觀察輸出的p,我們看到獲取的物件p和通過new操作符獲取的物件屬性以及屬性值一致,甚至連p.__proto__通過hasownproperty都無法檢測到!

通過以上的介紹,我們基本就可以解答本文開頭的那個問題了,其實就是建構函式裡,如果返回乙個非null的物件,則將該物件值賦值給新建的物件,其實上面的例項**還少了乙個是否返回物件的判斷,整理後應該是:

function

person(a, b) ;

}person.prototype.show = function

() ;

function

init() ;

p.__proto__ =person.prototype;

var temp = person.call(p, 'hanzichi', 10);

if(temp !== null && typeof temp === 'object')

returnp;}

var p =init();

console.log(p);

一道有意思的機試題

一道有意思的機試題 有四個學生 六門課程,要求使用三個頁面,第乙個頁面出現四個學生的選擇,選擇了學生後,到第二個頁面出現選擇了學生的列表,每個學生後面都有六門課程供學生選擇,選好課程後,到第三個頁面出現選擇了的學生和對應的課程列表。乍一看很簡單的一道題,不過我也用了乙個小時左右的時間,最快的乙個!題...

轉一道有意思的面試題

我的老同學開創了乙個軟體公司,富的流油。今天他到這個城市來後馬上打 給我 還好吧?我到這裡的大學招畢業生,要呆上五天,咱哥們趁這個機會好好聚一聚,我做東。既然他要做東,我理所當然順水推舟。來到他下榻的賓館,看見乙個大學生模樣的人站在他面前接受面試。我的老同學說 我這裡有個魔方,你能不能把它弄成六面六...

一道有意思的JS面試題

var name the window var object console.log object.getnamefunc 這道題答案就是 the window 我也毫不猶豫的掉進坑裡面了 苦悶啊 其實這種情況有些人會經常遇到就是會用 var this this 我相信這行 你一定寫過 先說一下函式...