function Foo(){
getName=function(){alert(1);}
console.log(this)
return this;
}
Foo.getName=function(){alert(2);}
Foo.prototype.getName=function(){alert(3);}
var getName=function(){alert(4);}
function getName(){alert(5);}
5-7不是很理解,解釋不出原因。
5是不是new關(guān)鍵字其實沒起什么作用呢?都只是調(diào)用一個方法而已?
Foo.getName(); //2
直接調(diào)用Foo自己的方法,而不是Foo對象的方法。Foo自己的方法是alert(2)那個,所以彈出2。
getName(); //4
這個沒什么好說的,函數(shù)聲明提升。
Foo().getName(); //1
這個就比較微妙了。仔細(xì)看Foo函數(shù),它的getName沒有用var聲明,所以這個getName實際上是window的,所以window的getName會被重新賦值。而它最后又返回了this,由于沒有用new調(diào)用,所以這里的this是window。
綜上,最終彈出的是1。
getName(); // 1
上一步把window的getName重新賦值了,所以這里彈出1。
new Foo.getName();//2
這里的new沒有任何作用。因為Foo沒有加括號,所以它實際上是先調(diào)用Foo.getName(),彈出2,然后再去new它的返回結(jié)果,也就是undefined。
new Foo().getName(); //3
這個加了括號,所以是先new一個Foo對象,再去調(diào)它的getName方法。Foo對象自身沒有g(shù)etName方法,去它的原型上去找,也就是彈出3的那個。
new new Foo().getName(); //3
最前面的new沒意義,實際執(zhí)行的時候是這樣的:new (new Foo().getName()),括號里的與前一條相同,最后的返回值為undefined,所以最前面那個new沒有實際意義。
先說一下你的代碼吧,F(xiàn)oo函數(shù)中getName=function(){alert(1);}這條語句實際上是聲明一個全局變量getName,并賦值為一個函數(shù),所以函數(shù)體內(nèi)的setName既不是Foo的方法,也不是Foo中的局部變量(因為你沒有使用this,也沒有使用var)
1.Foo.getName() // Foo.getName=function(){alert(2);}這條語句給Foo添加的方法,沒問題。
2.getName(); // 這里有個函數(shù)提升,雖然function getName(){alert(5);}語句在var getName=function(){alert(4);}語句之后執(zhí)行,但是由于函數(shù)聲明具有函數(shù)提升的效果(提到作用域最前端聲明),因此getName函數(shù)被var getName=function(){alert(4);}語句重寫了。
3.Foo().getName(); // 這里就是最開始提到的,你又聲明了一個全局的getName變量,因此getName函數(shù)又被重寫了,這里就相當(dāng)于調(diào)用window.getName(),得到結(jié)果1,也沒問題
4.getName() // 由于你第三步的重寫getName()函數(shù),所以這里結(jié)果和第三步是一樣的,也是window.getName()。
5.new Foo.getName(); // 這里new關(guān)鍵字沒有任何作用,因為Foo后面沒有().
6.new Foo().getName(); // 這里比較復(fù)雜了,你需要了解js中的new關(guān)鍵字實際上都做了什么工作,這里由于你的Foo并不是一個構(gòu)造函數(shù)(沒有this.getName = ...這樣的語句),因此new返回的對象中沒有g(shù)etName()方法,但是返回對象的原型中有g(shù)etName()方法,這里就是調(diào)用了Foo原型中的getName()方法,結(jié)果為3,沒問題。
7.前面的new沒意義,實際執(zhí)行的時候是這樣的:new (new Foo().getName()),而getName()又不是一個構(gòu)造函數(shù),因此這里就相當(dāng)于調(diào)用了Foo原型中的getName()方法,結(jié)果為3,沒問題。
從你對這道題的理解來看,個人建議你多看看js相關(guān)書籍,《javascript高級教程》《javascript語言精粹》都不錯
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。