将近20年前,当Javascript诞生时,它只是一种简单的Web
脚本语言。如果您忘记填写
用户名,它就会跳出警告。
现在,它已经变得几乎无所不能,从前面到后面,有各种不可思议的用途,
程序员用它来完成越来越多的项目。
Javascript代码的复杂性也在直线上升,单个
网页包含10000行Javascript代码,这是很常见的一段时间。2010,一位工程师透露Gmail的代码长度为443000行。
为了编写和
维护这样一个复杂的代码,必须采用模块化
策略,目前业界主流的做法是采用面向对象编程,因此,Javascript如何实现面向对象的编程已成为热门话题。
麻烦的是,Javascript语法不
支持阶级的程序员已经做了大量的探索研究如何使用Javascript来
模拟上课。本文总结三用Javascript定义类的
方法,讨论了各种方法的特点,并着重在我的眼睛最好的方法。
==============================================
Javascript定义类(类)的三种方法
在面向对象编程中,类(类)是对象(对象)的模板,定义同一组对象的公共
属性和方法(也称为实例)。
Javascript语言不支持类
一、构造
函数方法
这是一个经典的方法,也是教科书必须教的一种方法,它用构造函数模拟类,并用它中的关键字来引用一个实例对象。
复制代码代码如下所示:
函数猫(){
this.name =蛋;
}
当生成实例时,使用新关键字。
复制代码代码如下所示:
VaR CAT1 =新的猫();
警报(CAT1。名称); / /蛋
类的属性和方法也可以在构造函数的原型对象上定义。
复制代码代码如下所示:
cat.prototype.makesound =函数(){
警惕(喵);
}
对于这种方法的
详细介绍,请看一下我的一系列文章Javascript面向对象编程,它的主要缺点是它更复杂,使用这个和原型,而且很难写和读。
二,object.create()方法
为了
解决构造函数方法的缺点,它更容易生成对象。国际标准ECMAscript第五版的Javascript(目前在第三版中使用)已提出了一种新的方法object.create()。
这样,类是一个对象,而不是一个函数。
复制代码代码如下所示:
var
名称:蛋
makesound:(
功能){ alert(喵喵);}
};
然后,一个实例是object.create直接生成(),和新的不需要。
复制代码代码如下所示:
VaR CAT1 = object.create(猫);
警报(CAT1。名称); / /蛋
(CAT1。makesound); / /喵喵
目前,
最新版本的
浏览器,包括IE9,已经部署了这种方法。如果你有一个旧的浏览器,你可以将它与下面的代码。
复制代码代码如下所示:
如果(!对象(
创建){
object.create =功能(o){
函数(f){ }
f.prototype = O;
返回新的f();
};
}
此方法比构造函数方法简单,但不能实现私有属性和私有方法,也不能在实例之间共享数据。
三,最低限度的法律
荷兰程序员Gabor de Mooij提出了一个比object.create更好的新方法(),他称之为极简主义(简法)。这就是我的建议。
3.1封装
这个方法不使用这个和原型,而且代码部署起来非常简单,这可能就是为什么它被称为最低限度法则的
原因。
首先,它还对一个对象类,在这个类,构造函数创建新()的定义生成实例。
复制代码代码如下所示:
var
CreateNew:函数(){
这里的代码
}
};
然后,在新的(),一个实例对象的定义和实例对象作为返回值。
复制代码代码如下所示:
var
CreateNew: function () {
var;
cat.name =蛋;
(cat.makesound =功能){ alert(喵喵);};
返回的猫;
}
};
使用时,将创建新()方法,并实例对象可以得到。
复制代码代码如下所示:
VaR CAT1 = cat.createnew();
(CAT1。makesound); / /喵喵
该方法的优点是易于理解,结构清晰美观,符合传统面向对象编程结构,易于部署如下特点。
3.2继承
很方便的使一个类继承另一个类,只要在新的()的前法,后者的新方法可以称为()。
首先定义一个动物类。
复制代码代码如下所示:
var动物{ {
CreateNew:函数(){
var动物{ };
animal.sleep =函数(){ alert(睡眠懒惰);};
动物回归;
}
};
然后,在新的()方法的新猫,动物被称为()方法。
复制代码代码如下所示:
var
CreateNew:函数(){
VaR的猫= animal.createnew();
cat.name =蛋;
(cat.makesound =功能){ alert(喵喵);};
返回的猫;
}
};
这样的猫实例将继承猫类和动物类。
复制代码代码如下所示:
VaR CAT1 = cat.createnew();
(CAT1。睡眠); / /睡眠
3.3私有财产和私有方法
在创建新()方法,只要方法和属性不在猫的对象定义的,他们是私人的。
复制代码代码如下所示:
var
CreateNew:函数(){
var;
var喵;
cat.makesound =函数(){ alert(音)};};
返回的猫;
}
};
内部变量的
声音,外面看不懂,只有通过公共makesound猫()读取方法。
复制代码代码如下所示:
VaR CAT1 = cat.createnew();
警报(CAT1。声音); / /未定义
3.4数据共享
有时候,我们需要的所有实例对象的读写相同的内部数据。在这个时候,就把这个内部数据的外部类对象的内部,()的新方法。
复制代码代码如下所示:
var
声音:喵喵
CreateNew:函数(){
var;
cat.makesound =函数(){ alert(猫音)};};
cat.changesound =函数(x){ cat.sound = x;};
返回的猫;
}
};
然后,生成两个实例对象:
复制代码代码如下所示:
VaR CAT1 = cat.createnew();
Var cat2 = Cat.createNew ();
(CAT1。makesound); / /喵喵
此时,如果有一个实例对象,共享数据被
修改,另一个实例对象将受到
影响。
复制代码代码如下所示:
cat2.changesound(啦啦啦);
(CAT1。makesound); / /啦啦啦
(完成)