我喜欢的两个js类实现方式 现在再加上一个 极简主义法
闭包实现 变量是不会变的:)
1 var myApplication = function(){ 2 var name = 'Yuri'; 3 var age = '34'; 4 var status = 'single'; 5 function createMember(){ 6 name='Yuri2'; 7 } 8 function getMemberDetails(){ 9 return name; 10 } 11 return{ 12 create:createMember, 13 get:getMemberDetails, 14 name:name 15 } 16 }(); 17 myApplication.create(); 18 alert(myApplication.get()); 19 alert(myApplication.name);
非闭包 (每一次运行方式都 会修改代码)
1 var xxxx={ 2 name:'xxxx', 3 get:function(){ 4 return this.name; 5 }, 6 set:function(name){ 7 this.name=name 8 } 9 } 10 alert(xxxx.name); 11 alert(xxxx.get()); 12 xxxx.set('test') 13 14 alert(xxxx.get()); 15 alert(xxxx.name);
极简主义法
荷兰程序员Gabor de Mooij提出了一种比Object.create()更好的新方法,他称这种方法为"极简主义法"(minimalist approach)。这也是我推荐的方法。
3.1 封装
这种方法不使用this和prototype,代码部署起来非常简单,这大概也是它被叫做"极简主义法"的原因。
首先,它也是用一个对象模拟"类"。在这个类里面,定义一个构造函数createNew(),用来生成实例。
var Cat = {
createNew: function(){
// some code here
}
};
然后,在createNew()里面,定义一个实例对象,把这个实例对象作为返回值。
var Cat = {
createNew: function(){
var cat = {};
cat.name = "大毛";
cat.makeSound = function(){ alert("喵喵喵"); };
return cat;
}
};
使用的时候,调用createNew()方法,就可以得到实例对象。
var cat1 = Cat.createNew();
cat1.makeSound(); // 喵喵喵
这种方法的好处是,容易理解,结构清晰优雅,符合传统的"面向对象编程"的构造,因此可以方便地部署下面的特性。
3.2 继承
让一个类继承另一个类,实现起来很方便。只要在前者的createNew()方法中,调用后者的createNew()方法即可。
先定义一个Animal类。
var Animal = {
createNew: function(){
var animal = {};
animal.sleep = function(){ alert("睡懒觉"); };
return animal;
}
};
然后,在Cat的createNew()方法中,调用Animal的createNew()方法。
var Cat = {
createNew: function(){
var cat = Animal.createNew();
cat.name = "大毛";
cat.makeSound = function(){ alert("喵喵喵"); };
return cat;
}
};
这样得到的Cat实例,就会同时继承Cat类和Animal类。
var cat1 = Cat.createNew();
cat1.sleep(); // 睡懒觉
3.3 私有属性和私有方法
在createNew()方法中,只要不是定义在cat对象上的方法和属性,都是私有的。
var Cat = {
createNew: function(){
var cat = {};
var sound = "喵喵喵";
cat.makeSound = function(){ alert(sound); };
return cat;
}
};
上例的内部变量sound,外部无法读取,只有通过cat的公有方法makeSound()来读取。
var cat1 = Cat.createNew();
alert(cat1.sound); // undefined
3.4 数据共享
有时候,我们需要所有实例对象,能够读写同一项内部数据。这个时候,只要把这个内部数据,封装在类对象的里面、createNew()方法的外面即可。
var Cat = {
sound : "喵喵喵",
createNew: function(){
var cat = {};
cat.makeSound = function(){ alert(Cat.sound); };
cat.changeSound = function(x){ Cat.sound = x; };
return cat;
}
};
然后,生成两个实例对象:
var cat1 = Cat.createNew();
var cat2 = Cat.createNew();
cat1.makeSound(); // 喵喵喵
这时,如果有一个实例对象,修改了共享的数据,另一个实例对象也会受到影响。
cat2.changeSound("啦啦啦");
cat1.makeSound(); // 啦啦啦
1 var Animal = { 2 init: function(){ 3 var animal = { 4 name:'heelo11111', 5 sleep:function(){ alert("睡懒觉");} 6 7 }; 8 return animal; 9 } 10 }; 11 12 var Animal2 = { 13 init: function(){ 14 var animal = { 15 name:'heelo222', 16 sleep2:function(){ alert("睡懒觉2");}, 17 sleep22:function(){ alert("睡懒觉2");}, 18 sleep23:function(){ alert("睡懒觉2");}, 19 sleep24:function(){ alert("睡懒觉2");}, 20 sleep25:function(){ alert("睡懒觉25");} 21 22 }; 23 return animal; 24 } 25 }; 26 27 var Cat = { 28 sound:"ekekekekekeekek", 29 init: function(){ 30 var cat = Animal.init(); 31 var cat2 = Animal2.init(); 32 cat.name = "大毛"; 33 cat.makeSound = function(){ alert("喵喵喵"); }; 34 //合并两个对象 如果原来有节点不重写 35 for(var key in cat2){ 36 console.log(key); 37 if(!cat[key]){ 38 cat[key] = cat2[key]; 39 } 40 } 41 //console.log(cat); 42 43 var sound="private var"; 44 this.sound=sound; 45 return cat; 46 } 47 }; 48 49 50 var cat=Cat.init(); 51 cat.sleep(); 52 cat.sleep25(); 53 console.log(cat);