我原來的寫法都是這樣:
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;};
}