javascript 面向對象function詳解
js中的函數有三種表示方式:
//函數的第一種表示方式:函數關鍵字的方式 function f1() { alert("f1"); } //函數的第二種表示方式:函數字面量的方式 var f2 = function() { alert("f2"); } //函數的第三種表示方式:構造函數的方式 var f3 = new Function('var a = 100; b = 200; return a+b;'); alert(f3()); 函數的定義方式一般有以上三種,前兩種方式基本沒什么區別,第三種定義方式(Function()構造函數)每次執行時都解析函數主體,并創建一個新的函數對象。所以當在一個循環或者頻繁執行的函數中調用Function()構造函數的效率是非常低的。相反,函數字面量卻不是每次遇到都重新編譯的。一般不會采用第三種方式。
另外,分別執行alert(f1.constructor); alert(f2.constructor); alert(f3.constructor);都會出現同樣的效果,如下:

f1.constructor,f2.constructor,f3.constructor都是一個對象,為Function,這里可以這樣理解,這三個函數f1,f2,f3都是通過Function的形式產生的,所以他們的構造器就是Function,由此也可以推出這三種函數的產生方式其實內部原理是一樣的。
在JavaScript中,每個具有原型的對象都會自動獲得constructor屬性。對象的constructor屬性用于返回創建該對象的函數,也就是我們常說的構造函數。實際上,在js中,每一個function都是一個Function Object。

總結:
1、在js中一切皆對象;
2、在js中對象有一個屬性為constructor;
3、在js中,凡是函數都是構造器對象
另外,從面向對象的角度來理解,上面實例中f1是一個函數,同時它也是一個對象,constructor可以理解為它的一個屬性,并且這里可以利用該對象的constructor屬性找到它的構造函數。
可以為f1這個對象動態的添加屬性:
//給f1對象添加一個屬性為b,值為5 f1.b = 5; alert(f1.b); //給f1對象添加一個屬性為bb,bb為對象,值為var f2 = function() { alert("f2");} f1.bb = f2; alert(f1.bb); 在js中,任何一個對象都有可能成為另一個對象的屬性。
一個對象可以動態的添加任何一個屬性,但是這個對象必須有值,不能是null和undefined。
function Person() { //do something } function P() { //do something } function A() { //do something } function B() { //do something } Person.a = P; Person.a.b = A; Person.a.b.c = B; Person.a.b.c.d = f2; alert(Person.a.b.c.d); //正確,因為Person.a.b.c是有值的 alert(Person.a.b.c.d.e.f); //錯誤,不能為Person.a.b.c.d.e增加屬性f,因為Person.a.b.c.d.e是undefined 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答