開始之前我先明確個問題。如下代碼

<SCRIPT?LANGUAGE?=?"JavaScript">?
<!--?
Person.type?
=?"?person?"?;
Person.writeType?
=?function?()??{
????document.writeln(?
this?.type);
}
?
?
//?var?Person?=?function(){}//如果這樣定義會報錯,可以看看前面文章,函數的預編譯。?
??function??Person()??{}?
Person.writeType();
alert(?typeof?(Person));
?
for?(?var??key??in??Person)??{
????alert(key);
}
?
?var??person?
=?new??Person();
//?-->?
</SCRIPT>
在這里Person是個函數,但我們還可以定義它的屬性(type)。而Person有Object實例的特性(for in、可以定義屬性),但Person不是Object的實例。

見如下代碼:

<SCRIPT?LANGUAGE?=?"JavaScript">?
<!--?
Object.prototype.toString?
=?function?()??{?return??'myToString'}?;
?function??Person()??
{

}
?
?Person.prototype.toString?
=?function?()??{?return??'Person'}?;

?var??o?
=?new??Person();
alert(o);
alert(Person)
Person.toString?
=?function?()??{?return??'Person?toString'}?;
alert(Person)
//?-->?
</SCRIPT>?
?

我理解function返回的數據類型是和Object同等級的數據類型。它有Object實例(new Object())的一些特性,但它不是Object的實例,因為它沒有繼承Object.prototype.toString=function(){return 'myToString'};但我們Person.toString=function(){return 'Person toString'};改變了覆蓋了方法。
在《javascript權威指南》中,作者用這個特性實現了“類方法、類變量”static方法,與java中不同,這些方法不能用new Person()來調用。

Object?????????????????? function???????????? 同等級 function可以定義屬性,可以(for in)

new Object()??????? new function()??? 同等級 new function()繼承了Object的prototype, ?????????????????????????????????????????????????????也會繼承 function的prototype

小例子??戳嗽蛯ο缶秃芮宄税?。 原型對象最好在代碼最前面定義,很容易被覆蓋??!

<SCRIPT?LANGUAGE?=?"JavaScript">?
<!--?
??
var??Person?=?function??()??{
?????
this?.name?=?'Person的構造函數中屬性name';
?????
this?.getName?=?function?()??{
??????????
return???this?.name;
?}
?
??
//?this.toString=function(){}??//你把注釋去掉看看效果?
?}
?
Person.name?
=?"?Person?"?;
Person.toString?
=?function?()??{?return???this?.name?+?'的類方法'}?;?//?我可以用this啊?
?alert(Person.toString())?//?類方法?
?var??o?=?new??Person();
alert(o.getName());?
//?構造函數中的方法?
?alert(o);?//?訪問toString方法???先找??對象中?構造函數中???Person的prototype中???????Object的prototype中?
??Object.prototype.toString?=?function?()??{?return??'Object的prototype中的toString'}?;
alert(o);?
//?Object的prototype中?
??Person.prototype.toString?=?function?()??{?return??'Person的prototpe中的toString'}?;
alert(o);
o.toString?
=?function?()??{?return??'我覆蓋了toString方法了啊'}?
alert(o);
alert('我不能訪問前面的toString了。如果有super就好了!');
?
//?其實還是可以訪問到被覆蓋的原型的。那樣太復雜了。?
//
?-->?
</SCRIPT>?