最早应该是在阮一峰老师的博客上看到的这种类的构建方法,据说是由荷兰程序员 Gabor de Mooij 提出的一种比 Object.create ()更好的创建类的方法,他称这种方法为"极简主义法"(minimalist approach)。这种方法不使用 this 和 prototype,代码部署起来非常简单,这大概也是它被叫做"极简主义法"的原因。首先,它也是用一个对象模拟"类"。在这个类里面,定义一个构造函数 createNew (),用来生成实例。
类的创建
var Book={
createNew: function(){
var book={};
book.material='paper';
book.technology='print';
return book;
}
}
var english=Book.createNew();
利用createNew方法实例化之后,english的内容如下:
Object { material: "paper", technology: "print" }
类的继承
var Book={
createNew: function(){
var book={};
book.material='paper';
book.technology='print';
return book;
}
}
var Dict={
createNew: function(){
var dict=Book.createNew();
dict.package='box';
return dict;
}
}
var english=Dict.createNew();
重新利用createNew方法实例化之后,english的内容如下:
Object { material: "paper", technology: "print", package: "box" }
添加变量
var Book={
createNew: function(){
var book={};
book.material='paper';
book.technology='print';
return book;
}
}
var Dict={
createNew: function(language,price){
var dict=Book.createNew();
dict.package='box';
dict.price=price;
dict.language=language;
return dict;
}
}
var english=Dict.createNew('english',88);
新的english的对象内容如下:
Object { material: "paper", technology: "print", package: "box", price: 88, language: "english" }
私有变量和内部变量
在createNew()方法中,只要不是定义在cat对象上的方法和属性,都是私有的。
var Book={
createNew: function(){
var book={};
book.material='paper';
book.technology='print';
return book;
}
}
var Dict={
createNew: function(language,price){
var dict=Book.createNew();
package='box';
dict.price=price;
dict.language=language;
dict.showPackage=function(){console.log(package);};
return dict;
}
}
var english=Dict.createNew('english',88);
这个例子中的package就是一个内部变量,它只能被showPackage读取到;
var Book={
createNew: function(){
var book={};
book.material='paper';
book.technology='print';
book.changeMaterial = function(x){ book.material = x; };
return book;
}
}
var Dict={
createNew: function(language,price){
var dict=Book.createNew();
package='box';
dict.price=price;
dict.language=language;
dict.showPackage=function(){console.log(package);};
return dict;
}
}
var english=Dict.createNew('english',88);
var japanese=Dict.createNew('japanese',88);
japanese.changeMaterial('wood');
这个例子的运行结果如下:
english
Object { material: "paper", technology: "print", changeMaterial: changeMaterial(x), price: 88, language: "english", showPackage: showPackage()
}
japanese
Object { material: "wood", technology: "print", changeMaterial: changeMaterial(x), price: 88, language: "japanese", showPackage: showPackage() }
数据共享
有时候,我们需要所有实例对象,能够读写同一项内部数据。这个时候,只要把这个内部数据,封装在类对象的里面、createNew()方法的外面即可。
var Book={
material:'paper',
createNew: function(){
var book={};
book.technology='print';
book.changeMaterial = function(x){ Book.material = x; };
book.showMaterial = function(){ console.log(Book.material); };
return book;
}
}
var Dict={
createNew: function(language,price){
var dict=Book.createNew();
package='box';
dict.price=price;
dict.language=language;
dict.showPackage=function(){console.log(package);};
return dict;
}
}
var english=Dict.createNew('english',88);
var japanese=Dict.createNew('japanese',88);
japanese.changeMaterial('wood');
在这个实例中,changeMaterial将内部变量material从paper修改为了wood,程序运行结果如下:
english.showMaterial() --> wood
japanese.showMaterial() --> wood