我原來的寫法都是這樣:
1 function Dog(){ 2 this.name = 'hachi'; 3 } 4 5 Dog.prototype = { 6 makeNoise:function(){ 7 alert('wangwangwang'); 8 } 9 };後來又看到另外一種復雜一點而且看起來好像沒有必要的寫法:
01 function Dog(){ 02 var privateVariable = 'secret'; 03 04 var fn = function(){ 05 //... 06 } 07 08 fn.prototype = { 09 makeNoise:function(){ 10 alert('wangwangwang'); 11 } 12 } 13 14 return fn; 15 }這裡的Dog函數其實是一個 制造類 的函數,它返回了真正的Dog類。
感覺這樣做的好處是更好的實現了封裝。
例如這裡的privateVariable就是一個私有變量:
另外如果在第一個例子的最後加上一句:
1 Dog.prototype = { 2 //e...WTF?? 3 }這樣Dog就不是Dog了~
後來的理解:
上面這樣新建類的方法直接重寫了prototype對象。這樣prototype原本內置的屬性就沒有了(arguments, call, apply等)。
下面這種新建類的方法好像更好一些: