根据面向对象的设计原则,类型的所有成员应该都被封装在类结构体内。例如:
function Book(title,pages){ //构造函数模式设计
this.title = title;
this.pages = pages;
Book.prototype.what = function(){ //原型模式设计,位于类的内部
console.log(this.title +this.pages);
};
}
但当每次实例化时,类Book中包含的原型方法就会被重复创建,生成大量原型方法,浪费系统资源。因此,可以使用if判断原型方法是否存在,如果存在就不再创建该方法,否则就创建方法。
function Book(title,pages){
this.title = title;
this.pages = pages;
if(typeof Book.isLock == "undefined"){ //创建原型方法的锁,如果不存在则创建
Book.prototype.what = function(){
console.log(this.title +this.pages);
};
Book.isLock = true; //创建原型方法后,把锁锁上,避免重复创建
}
}
var book1 = new Book("JavaScript程序设计",160);
var book2 = new Book("C程序设计",240);
console.log(book1.title);
console.log(book2.title);
typeof Book.isLock表达式能够检测该属性值的类型,如果返回为undefined字符串,则不存在该属性值,说明没有创建原型方法,则允许创建原型方法,并设置该属性的值为true,这样就不用重复创建原型方法。这里使用类名Book,而没有使用this,这是因为原型是属于类本身的,而不是对象实例的。
提示,动态原型模式与构造原型模式在性能上是等价的,用户可以自由选择,不过构造原型模式应用比较广泛。