Javascript定义类(class)的三种方法
在面向对象的编程中,类(class)是对象()的模板,定义了同一组对象(也称为“实例”)共有的属性和方法。
该语言不支持“类”,但可以使用一些变通方法来模拟“类”。
一、构造方法
这是一种经典的方法,也是教科书中必传的方法。它模拟了一个带有构造函数的“类”,在里面用this关键字引用实例对象。
猫(){
this.name = "大毛";
}
生成实例时,使用new关键字。
var cat1 = new Cat();
警报(猫1.名字); // 大毛
类的属性和方法,也可以定义在构造函数的对象之上。
猫.. = (){
alert("喵喵喵");
}
关于这个方法的详细介绍请看我写的系列文章,这里就不多说了。它的主要缺点是比较复杂,用这个and,写和读都很费劲。
二、.() 方法
为了解决“构造方法”的不足,更方便地生成对象,国际标准第五版(目前流行的是第三版),提出了一种新的方法。
这样,“类”是一个对象,而不是一个函数。
变种猫 = {
姓名:“大毛”,
: (){ alert("喵喵喵"); }
};
然后,直接使用.()生成实例,不使用new。
var cat1 = .(Cat);
警报(猫1.名字); // 大头发
猫1.( ); //喵喵喵
目前各大浏览器的最新版本(包括IE9))都部署了这种方法。如果遇到老浏览器,可以自己使用下面的代码部署。
如果 (!.) {
。 = (o) {
F() {}
F。 = o;
新的 F();
};
}
这种方法比“构造方法”简单,但不能实现私有属性和私有方法,实例对象之间不能共享数据,对“类”的模拟不够全面。
三、极简主义
荷兰程序员 Gabor de Mooij 提出了一种比 .() 更好的新方法,他称之为“极简主义方法”( )。这也是我推荐的方法。
3.1 封装
这个方法没有用到这个,而且代码部署起来很简单,这大概就是它被称为“极简方法”的原因吧。
首先方法,它还使用一个对象来模拟一个“类”。在这个类中,定义一个构造函数()来生成一个实例。
变种猫 = {
: (){
//这里有一些代码
}
};
然后,在()中,定义一个实例对象,把这个实例对象作为返回值。
变种猫 = {
: (){
var cat = {};
cat.name = "大猫";
猫。 = (){ alert("喵喵"); };
猫;
}
};
使用时调用()方法获取实例对象。
var cat1 = Cat.();
猫1.(); //喵喵喵
这种方法的优点是易于理解,结构清晰优雅,符合传统的“面向对象编程”结构,因此可以轻松部署以下特性。
3.2 继承
让一个类继承另一个类,实现起来非常方便。只需在前者的()方法中调用后者的()方法即可。 () 方法。
首先定义一个类。
var = {
: (){
var = {};
.sleep = (){ alert("睡晚了"); };
;
}
};
然后,在 Cat 的 () 方法中,调用 () 方法。
变种猫 = {
: (){
var cat = .();
cat.name = "大毛" ;
猫。 = (){ alert("喵喵喵"); };
猫;
}
};
这样得到的Cat实例会继承Cat类和类。
var cat1 = Cat.();
猫1.睡眠(); // 晚睡
3.3 私有属性和私有方法
在()方法中方法,只要没有在cat对象上定义方法和属性,都是私有的。
变种猫 = {
: (){
var cat = {};
var sound = "喵喵喵" ;
猫。 = (){ 警报(声音); };
猫;
}
};
上面例子的内部变量sound不能被外部读取,只能通过cat的公共方法()。
var cat1 = Cat.();
警报(猫1.声音); //
3.4 数据共享
有时,我们需要所有实例对象都能够读取和写入相同的内部数据。这时候,只需将这个内部数据封装在类对象内部和()方法之外。
变种猫 = {
声音:“喵喵喵”,
: (){
var cat = {};
猫。 = (){ 警报(Cat.sound); };
猫。 = (x){ Cat.sound = x; };
猫;
}
};
然后,生成两个实例对象:
var cat1 = Cat.();
var cat2 = Cat.();
猫1.(); //喵喵喵
此时如果有实例对象,修改共享数据,也会影响另一个实例对象。
猫2.("啦啦啦");
猫1.(); //啦啦啦
(结束)