<script language="javascript">
var o = document.body;
//创建链接
function createA(url,text)
{
var a = document.createElement("a");
a.href = url;
a.innerHTML = text;
a.style.color = "red";
o.appendChild(a);
}
createA("","My Home Page ");
</script>


第一种模式:工厂方式

var lev=function(){  
  
   return "啊打";  
};  
function Parent(){  
       var  Child = new Object();   <span id="Codehighlighter1_126_381_Open_Text"><span style="color:#008000;">//</span><span style="color:#008000;"> 或者 var Child= new Object ;</span></span>
       Child.name="李小龙";  
       Child.age="30";  
       Child.lev=lev; 
       Child.showColor2=showColor; 
     <span id="Codehighlighter1_126_381_Open_Text"><span style="color:#000000;">  Child.showColor </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000ff;">function</span><span style="color:#000000;"> ()</span><span id="Codehighlighter1_255_275_Open_Text"><span style="color:#000000;">{   
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />        alert(</span><span style="color:#000000;">123</span><span style="color:#000000;">);
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />    }</span></span><span style="color:#000000;"> ;    </span><span style="color:#008000;">//</span><span style="color:#008000;"> 记住,这里一定要用 ; 表示结束</span></span>
     return Child; <span id="Codehighlighter1_126_381_Open_Text"><span style="color:#008000;">//</span><span style="color:#008000;"> 不是 return this.Child ; 因为 this.Child===unfined</span></span> 
};  
  
var  x = Parent();  
alert(x.name);  
alert(x.lev());



使用这种方式必须创建对象的方法。每次调用 createCar(),都要创建 showColor(),意味着每一个对象


  都有自己的 showColor 版本,事实上,每一个对象都共享了是同一个函数.


  有些开发者在工厂函数外定义对象的方法,然后通过属性指向该方法。从而避免这个问题!!!!


function showColor2(){
    alert(this.color);
}
var oCar4 = createCar2('black');
oCar4.showColor2();




引用该对象的时候,这里使用的是 var x = Parent()而不是 var x = new Parent();因为后者会可能出现很多问题(前者也成为工厂经典方式,后者称之为混合工厂方式)


第二种模式:构造函数方式   function(){}

var lev=function(){  
      
       return "啊打";  
    };  
    function Parent(){  
            
           this.name="李小龙";  
           this.age="30";  
           this.lev=lev;  
         
    };  
      
    var  x =new  Parent();  
    alert(x.name);  
    alert(x.lev());



与工厂方式相比,使用构造函数方式创建对象,无需再函数内部重建创建对象,而使用this指代,并而函数无需明确return


与第 1个 存在相同问题  方法重复


第3种模式:原型模式  .prototype.

var lev=function(){  
      
       return "啊打";  
    };  
    function Parent(){  
            
         
    };  
      Parent.prototype.name="李小龙";  
      Parent.prototype.age="30";  
     Parent.prototype.lev=lev;  
      
    var  x =new  Parent();  
    alert(x.name);  
    alert(x.lev());

不能传递参数, 函数 属性 都共享


alert(pcar1 

instanceof  PCar);   //  output "true"



第四种模式:混合的构造函数,原型方式(推荐)

function Parent(){  
      this.name="李小龙";  
     this.age=32;  
         
    };   
    Parent.prototype.lev=function(){  
      
       return this.name;  
    };;  
      
    var  x =new  Parent();  
      
    alert(x.lev());



说明:     1.该模式是指混合搭配使用构造函数方式和原型方式


          2.将所有属性不是方法的属性定义在函数中(构造函数方式)

将所有属性值为方法的属性利用prototype在函数之外定义(原型方式)

第五种模式:动态原型方式(推荐)

function Parent(){  
  this.name="李小龙";  
 this.age=32;  
;  
 if(typeof Parent._lev==="undefined"){  
            
       
     Parent.prototype.lev=function(){  
  
               return this.name;  
     }  
     Parent._lev=true;  
 }  
     
};   
  
  
var  x =new  Parent();  
  
alert(x.lev());



/*

  对于习惯使用其他开发语言的开发者来说,使用混合构造函数/原型方式感觉不那么和谐。批评构造函数/原型方式的人

  认为,在构造函数内找属性,在外部找方法的做法不合理。所以他们设计了动态原型方式,以供更友好的编码风格。


  动态原型方式的基本想法与混合构造函数/原型方式 相同,即在构造函数内定义非函数的属性,而函数的属性则利用

  原型属性定义。唯一的区别是赋予对象方法的位置。下面是使用动态原型方法重写的 Car 类:

*/

从而保证创建该对象的实例时,属性的方法不会被重复创建