一道超级复杂的js题目
先看以下代碼:
1 function Foo(){ 2 getName = function(){ alert(1); }; 3 return this; 4 } 5 Foo.getName = function(){ alert(2); }; 6 Foo.prototype.getName = function(){ alert(3); }; 7 var getName = function(){ alert(4); }; 8 function getName(){ alert(5) }; 9 10 Foo.getName(); 11 getName(); 12 Foo().getName(); 13 getName(); 14 new Foo.getName(); 15 new Foo().getName(); 16 new new Foo().getName();?
怎么樣?是不是有點糊涂了。
首先要明確下面一些基本知識:
1、 this的指向只取決于調(diào)用的方式,,函數(shù)定義里面的this指向全局的window;
new的過程:新建對象,讓this指向它,返回this。
普通的函數(shù)調(diào)用時得到的值是return的返回值,new 得到值可能是this也有可能是return 的值,這取決于return后面數(shù)據(jù)的類型。
2、實例化對象訪問一個屬性的順序,先看自身有沒有這個屬性,再看訪問原型里的。
3、new 后面跟的是一個構造函數(shù),則會創(chuàng)建一個對象。如果是一個構造函數(shù)的屬性名稱,那么沒有任何作用。
?new 只會和離他最近的()結(jié)合
請看下面的一張圖:
一開始Foo.getName()為1,第5行代碼將它修改為2,所以Foo.getName()的輸出為2;
getName() 是全局調(diào)用,函數(shù)提升優(yōu)先于變量提升,到了第7行代碼getName()被修改為4,所以輸出為4;
Foo()是函數(shù)調(diào)用,得到的是return后面的值this,this指向window,并且第2行代碼將getName()修改為1,所以結(jié)果為1
同理,getName()的輸出也是為1;
new Foo.getName() new沒有任何作用,這里是方法調(diào)用,輸出值為2
new Foo().getName() new和最近的一個()結(jié)合,所以得到了一個實例化對象,實例化對象自身沒有getName這個屬性,所以訪問原型里面的getName,為 3
new new Foo().getName() 最前面的new沒有任何意義,同上一個
轉(zhuǎn)載于:https://www.cnblogs.com/liuluteresa/p/6516298.html
總結(jié)
以上是生活随笔為你收集整理的一道超级复杂的js题目的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每一个程序员都应该知道的高并发处理技巧、
- 下一篇: 《自动化技术中的进给电气传动》1.4节读