天天看點

javascript中的Function對象javascript中的Function對象

名詞解釋:

        constructor    儲存了對建立該對象的"類"的引用

        prototype    儲存了該類"父"類型的執行個體對象的引用(模闆),在JS中屬于Function的屬性

        prototype模式   通過對模闆類執行個體進行複制,來産生新的對象,有點象工廠

javascript中的Function對象

        js中的function 并不同于我們在C等語言中的執行過程,在js中,他實際上是一個"類",這個類起到了支撐的作用,下面一起來看看這個類

       1.js 對象模式

          JS通過prototype來進行類的繼承(實際上是擴充),prototype是一種設計模式, (參見《設計模式》),prototype

 需要一個類作為模闆,在JS中這個類就是object, 熟悉原形模式的人可以能已經知道 var o = new Object(); 這段代碼實際做了什麼,事實上他并不是我們在C中的malloc或者c ++ 中的new, 這裡實際上通知Object()這個方法(Object()實際上不是我們在JAVA中了解的那樣, 下面會講到),以object的執行個體對象為模闆,并加入新的屬性(在Object()中定義的) 來産生一個對象并傳回,所有的對象都是這樣産生的

       2.Function 的角色

          那麼Function充當什麼角色呢, 看下面的代碼......

javascript中的Function對象javascript中的Function對象
javascript中的Function對象javascript中的Function對象

var

 f 

=

new

 Function(

"

this.bb = 1

"

);

javascript中的Function對象javascript中的Function對象

var

 b 

=

new

 f();

javascript中的Function對象javascript中的Function對象

    alert(b.bb); 

1

javascript中的Function對象javascript中的Function對象
javascript中的Function對象javascript中的Function對象

    alert(

typeof

 b); object 

//

b是一個object類的對象

javascript中的Function對象javascript中的Function對象

    alert(b.constructor); 

//

function f(){var aa = 1; }

javascript中的Function對象javascript中的Function對象

    alert(b.prototype); 

//

undefined 就象前面所說的,new 操作符傳回一個object類的執行個體,因為object被作為模闆,是以它本身沒有模闆,那麼它的prototype值也就未定義了

javascript中的Function對象javascript中的Function對象
javascript中的Function對象javascript中的Function對象

    alert(

typeof

 f); 

//

function f是一個function類的對象

javascript中的Function對象javascript中的Function對象

    alert(f.constructor); 

//

function Function(){[native code]}

javascript中的Function對象javascript中的Function對象

    alert(f.prototype); 

//

[object Object] //注意這裡,f是Function的一個執行個體,他的原形為object。到這裡,您可能還沒有想明白是怎麼回事,難道Function繼承自Object嗎??呵呵..看下面

javascript中的Function對象javascript中的Function對象
javascript中的Function對象javascript中的Function對象

 alert(

typeof

 Function);

//

function Function是JS内置的對象

javascript中的Function對象javascript中的Function對象

 alert(Function.constructor);

//

 function Function(){[native code]}

javascript中的Function對象javascript中的Function對象

 alert(Function.prototype); 

//

function prototype(){[native code]}  注意這裡,很關鍵,它就是執行個體化object的地方

javascript中的Function對象javascript中的Function對象

alert(Function.prototype.constructor); 

//

function Function(){[native code]}

javascript中的Function對象javascript中的Function對象

alert(Function.prototype.prototype); 

//

undefined //按道理所有的function xxx都應該繼承自Function,也就是說,這裡應該是object,但這裡為未定義,表明Function實際上是一個根包裝類,prototype()的傳回值就是object的執行個體

為什麼說Function是根包裝類,看下面的代碼.....

javascript中的Function對象javascript中的Function對象

var

 o 

=

new

 Object();

javascript中的Function對象javascript中的Function對象

    alert(

typeof

 o); 

//

object

javascript中的Function對象javascript中的Function對象

    alert(o.constructor); 

//

function Object(){[native code]} o是由Object這個類來産生的

javascript中的Function對象javascript中的Function對象

    alert(o.prototype); 

//

undefined 

javascript中的Function對象javascript中的Function對象
javascript中的Function對象javascript中的Function對象

    alert(

typeof

 Object);

//

 function

javascript中的Function對象javascript中的Function對象

    alert(Object.constructor); 

//

function Function(){[native code]} Object 是由Function産生的

javascript中的Function對象javascript中的Function對象

    alert(Object.prototype); 

//

[object Object]

現在明白了吧。。。

在js 中把 function xx(){} 稱為構造函數的原因就是因為,不管你繼承了多少, 你的constructor最終會指向Function 調用本地方法産生一個object,不管方式如何,總之産生了一個對象,是以叫構造也很貼切

以上是我在實際使用中發現的,沒有參考過nn資料,不對的歡迎指正

[email protected]

繼續閱讀