function或許你經常寫物件導向程式設計的**,也熟悉以上**中this的用法甚至是prototype或者原型鏈,但是還是無法解釋上面**的輸出,這時我們不得不承認對new的了解還不是很透徹。fn1() ;
}function
fn2()
var obj1 = new
fn1();
var obj2 = new
fn2();
console.log(obj1.name, obj2.name);
先看一段普通的使用new操作符建立物件的**:
function將console的內容截圖:person(a, b)
person.prototype.show = function
() ;
var p = new person('hanzichi', 10);
console.log(p);
我們可以清楚看到,p是乙個物件,並且擁有建構函式person中建立的name和age屬性,還有個__proto__屬性(這貨太特殊,反正不在p的hasownproperty內!),其值為建構函式的prototype屬性值。
其實new操作符建立物件可以分為四個步驟:
建立乙個空物件
將所建立物件的__proto__屬性值設成建構函式的prototype屬性值
執行建構函式中的**,建構函式中的this指向該物件
返回該物件(除非建構函式中返回乙個物件)
用**表示如下:
觀察輸出的p,我們看到獲取的物件p和通過new操作符獲取的物件屬性以及屬性值一致,甚至連p.__proto__通過hasownproperty都無法檢測到!
通過以上的介紹,我們基本就可以解答本文開頭的那個問題了,其實就是建構函式裡,如果返回乙個非null的物件,則將該物件值賦值給新建的物件,其實上面的例項**還少了乙個是否返回物件的判斷,整理後應該是:
functionperson(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 我相信這行 你一定寫過 先說一下函式...