我本来的写法都是如许:
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;};
}