我原本的寫法都是這樣:
function Dog(){ this.name = 'hachi'; } Dog.prototype = { makeNoise:function(){ alert('wangwangwang'); } };
後來又看到另外一種複雜一點而且看起來好像沒有必要的寫法:
function Dog(){ var privateVariable = 'secret'; var fn = function(){ //... } fn.prototype = { makeNoise:function(){ alert('wangwangwang'); } } return fn; }
這裡的Dog函數其實是一個 製造類別 的函數,它回傳了真正的Dog類別。
感覺這樣做的好處是更好的實現了封裝。
例如這裡的privateVariable就是一個私有變數:
var d = new Dog; d.privateVariable //undefined
另外如果在第一個例子的最後加上一句:
Dog.prototype = { //e...WTF?? }
這樣Dog就不是Dog了~
後來的理解:
上面這樣新建類別的方法直接重寫了prototype物件。這樣prototype原本內建的屬性就沒有了(arguments, call, apply等)。
下面這種新建類別的方法好像比較好:
var Dog = function(name){ this.name = name; var privateVariable = 'you cannot see me.'; this.getPrivate = function(){return privateVariable;}; }