名詞解釋:
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充當什麼角色呢, 看下面的代碼......


var
f
=
new
Function(
"
this.bb = 1
"
);

var
b
=
new
f();

alert(b.bb);
1


alert(
typeof
b); object
//
b是一個object類的對象

alert(b.constructor);
//
function f(){var aa = 1; }

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


alert(
typeof
f);
//
function f是一個function類的對象

alert(f.constructor);
//
function Function(){[native code]}

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


alert(
typeof
Function);
//
function Function是JS内置的對象

alert(Function.constructor);
//
function Function(){[native code]}

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

alert(Function.prototype.constructor);
//
function Function(){[native code]}

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

var
o
=
new
Object();

alert(
typeof
o);
//
object

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

alert(o.prototype);
//
undefined


alert(
typeof
Object);
//
function

alert(Object.constructor);
//
function Function(){[native code]} Object 是由Function産生的

alert(Object.prototype);
//
[object Object]
現在明白了吧。。。
在js 中把 function xx(){} 稱為構造函數的原因就是因為,不管你繼承了多少, 你的constructor最終會指向Function 調用本地方法産生一個object,不管方式如何,總之産生了一個對象,是以叫構造也很貼切
以上是我在實際使用中發現的,沒有參考過nn資料,不對的歡迎指正
[email protected]