开始之前我先明确个问题。如下代码

<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>