Javascript定义类的极简主义法
如今,Javascript变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途。程序员用它完成越来越庞大的项目。Javascript代码的复杂度也直线上升。单个网页包含10000行Javascript代码,早就司空见惯。编写和维护如此复杂的代码,必须使用模块化策略。目前,业界的主流做法是采用”面向对象编程”。因此,Javascript如何实现面向对象编程,就成了一个热门课题。麻烦的是,Javascipt语法不支持”类”),导致传统的面向对象编程方法无法直接使用。程序员们做了很多探索,研究如何用Javascript模拟”类”。
总之,程序员们做出了很多尝试,其中就有极简主义法:
1.封装
首先,它也是用一个对象模拟”类”。在这个类里面,定义一个构造函数createNew(),用来生成实例。
1 var Cat = { 2 createNew: function(){ 3 //some code here 4 } 5 };
然后,在createNew()里面,定义一个实例对象,把这个实例对象作为返回值。
1 var Cat = { 2 createNew: function(){ 3 var cat = {}; 4 cat.name = '大毛'; 5 cat.makesound = function(){alter("喵喵喵")}; 6 return cat; 7 } 8 };
使用的时候,调用createNew()方法,就可以得到实例对象。
1 var cat1 = Cat.createNew(); 2 cat1.makeSound(); // 喵喵喵
这种方法的好处是,容易理解,结构清晰优雅,符合传统的”面向对象编程”的构造,因此可以方便地部署下面的特性。
2.继承
让一个类继承另一个类,实现起来很方便。只要在前者的createNew()方法中,调用后者的createNew()方法即可。
先定义一个Animal类:
1 var Animal = { 2 createNew: function(){ 3 var animal = {}; 4 animal.sleep = function(){ alert("睡懒觉"); }; 5 return animal; 6 } 7 };
然后,在Cat的createNew()方法中,调用Animal的createNew()方法。
1 var Cat = { 2 createNew: function(){ 3 var cat = Animal.createNew(); 4 cat.name = "大毛"; 5 cat.makeSound = function(){ alert("喵喵喵"); }; 6 return cat; 7 } 8 };
这样得到的Cat实例,就会同时继承Cat类和Animal类:
1 var cat1 = Cat.createNew(); 2 cat1.sleep(); // 睡懒觉
3.私有属性和私有方法
在createNew()方法中,只要不是定义在cat对象上的方法和属性,都是私有的。
1 var Cat = { 2 createNew: function(){ 3 var cat = {}; 4 var sound = "喵喵喵"; 5 cat.makeSound = function(){ alert(sound); }; 6 return cat; 7 } 8 };
上例的内部变量sound,外部无法读取,只有通过cat的公有方法makeSound()来读取。
1 var cat1 = Cat.createNew(); 2 alert(cat1.sound); // undefined
4.数据共享
有时候,我们需要所有实例对象,能够读写同一项内部数据。这个时候,只要把这个内部数据,封装在类对象的里面,createNew()方法外即可。
1 var Cat = { 2 sound : "喵喵喵", 3 createNew: function(){ 4 var cat = {}; 5 cat.makeSound = function(){ alert(Cat.sound); }; 6 cat.changeSound = function(x){ Cat.sound = x; }; 7 return cat; 8 } 9 };
然后,生成两个实例对象:
1 var cat1 = Cat.createNew(); 2 var cat2 = Cat.createNew(); 3 cat1.makeSound(); // 喵喵喵
这时,如果有一个实例对象,修改了共享的数据,另一个实例对象也会受到影响:
1 cat2.changeSound("啦啦啦"); 2 cat1.makeSound(); // 啦啦啦