構造函數方法有對象方法、類方法、原型方法 首先來看直接調用,這種情況下只有類方法能直接使用。 然後來看下new出新的實例,這種情況下,實例方法和原型方法都可以用,但是類方法不能用。new出來的實例會包含實例方法和屬性,然後實例的原型上會有原型方法,所以這二者可以用。 總結: 1.類方法是不需要進行實 ...
構造函數方法有對象方法、類方法、原型方法,這些方法在什麼時候可以調用,什麼時候不能調用,為什麼?
function Func(name){ this.name=name; this.ff=function(){ //對象方法 console.log(this.name); }; } Func.ff2=function(name){//類方法 console.log(name); } Func.prototype.ff3=function(){//原型方法 console.log(this.name); };
直接調用
這種情況下只有類方法能直接使用
Func.ff(); //VM1239:12 Uncaught TypeError: Func.ff is not a function Func.ff2('jack');//jack Func.ff3();//Uncaught TypeError: Func.ff3 is not a function
1.函數里this指向是由函數執行時的執行上下文也就是執行環境決定的,並不是由定義它的函數決定的 ,所以this並不是直接指向函數Func,也就說函數內部的this.ff != Func.ff。
2.Func是一個函數也是一個對象,ff2是這個對象的一個方法,所以可以調用。
3.Func.prototype.ff3,這個ff3是Func的prototype屬性的方法,只有實例才可以訪問。而Func的構造函數是Function,它的原型並沒有這個方法,所以報錯。如果這樣用【Func.prototype.ff3()】是可以調用到的。或者這樣定義【Function.prototype.ff3=function(){};】,這樣才能在Func的構造函數的原型上搜索到ff3,就能Func.ff3()調用。
原型鏈查找機制,是先在對象內查找屬性和方法,若沒有找到則沿著原型鏈往上找,如果找到頭都沒找到,那就是沒有這個屬性或者方法。
實例調用
這種情況下,實例方法和原型方法都可以用,但是類方法不能用。
var nff=new Func('jack'); nff.ff(); //jack nff.ff2('jack');//VM1257:12 Uncaught TypeError: nff.ff2 is not a function nff.ff3('jack');//jack
1.使用new實例化Func以後得到實例nff,函數內部的this指向的就是實例本身,所以此時的this.ff==nff.ff。但是我們只能說this.name和this.ff的this就是nff,而this.ff內部的this依然是由執行上下文決定。
2.實例nff的私有空間內沒有ff2這個方法,原型鏈上也沒有,所以報錯。
3.實例nff上沒有ff3,但是ff3的原型Func.prototype上有
關於這裡的第1條,可以證明下,請看。
不管是直接執行TT(),還是TT.ff(),第一個this就是實例本身,而第二個this是依據執行環境決定的,可以對比下麵兩個圖看得出來。
總結:
1.類方法屬於構造函數私有的方法,可以直接使用。
2.對象方法和原型方法,只有實例化之後才可以使用。實例化之後,不繼承類方法。
這個我也不是太懂,如果有幸被大佬看到,還請幫忙指點下。