開(kāi)始之前我先明確個(gè)問(wèn)題。如下代碼

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

見(jiàn)如下代碼:

<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返回的數(shù)據(jù)類(lèi)型是和Object同等級(jí)的數(shù)據(jù)類(lèi)型。它有Object實(shí)例(new Object())的一些特性,但它不是Object的實(shí)例,因?yàn)樗鼪](méi)有繼承Object.prototype.toString=function(){return 'myToString'};但我們Person.toString=function(){return 'Person toString'};改變了覆蓋了方法。
在《javascript權(quán)威指南》中,作者用這個(gè)特性實(shí)現(xiàn)了“類(lèi)方法、類(lèi)變量”static方法,與java中不同,這些方法不能用new Person()來(lái)調(diào)用。

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

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

小例子。看了原型對(duì)象就很清楚了啊。 原型對(duì)象最好在代碼最前面定義,很容易被覆蓋啊!

<SCRIPT?LANGUAGE?=?"JavaScript">?
<!--?
??
var??Person?=?function??()??{
?????
this?.name?=?'Person的構(gòu)造函數(shù)中屬性name';
?????
this?.getName?=?function?()??{
??????????
return???this?.name;
?}
?
??
//?this.toString=function(){}??//你把注釋去掉看看效果?
?}
?
Person.name?
=?"?Person?"?;
Person.toString?
=?function?()??{?return???this?.name?+?'的類(lèi)方法'}?;?//?我可以用this啊?
?alert(Person.toString())?//?類(lèi)方法?
?var??o?=?new??Person();
alert(o.getName());?
//?構(gòu)造函數(shù)中的方法?
?alert(o);?//?訪問(wèn)toString方法???先找??對(duì)象中?構(gòu)造函數(shù)中???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('我不能訪問(wèn)前面的toString了。如果有super就好了!');
?
//?其實(shí)還是可以訪問(wèn)到被覆蓋的原型的。那樣太復(fù)雜了。?
//
?-->?
</SCRIPT>?