面向对象编程
javascript语言中一切皆为对象!
对象究竟是什么?什么叫面向对象编程?
对象(object),台湾译作物件,是面向对象(Object Oriented)中的术语,既表示客观世界问题空间(Namespace)中的某个具体的事物,又表示软件系统解空间中的基本元素。
在软件系统中,对象具有唯一的标识符,对象包括属性(Properties)和方法(Methods),属性就是需要记忆的信息,方法就是对象能够提供的服务。在面向对象(Object Oriented)的软件中,对象(Object)是某一个类(Class)的实例(Instance)。 —— 维基百科
对象是从我们现实生活中抽象出来的一个概念,俗话说物以类聚,人以群分,我们也经常说有一类人,他们专业给隔壁家制造惊喜,也就是我们说的老王
这里面就有两个重要概念
- 类:无论是物以类聚,还是有一类人,这里说的类并不是实际存在的事物,是一些特征、是一些规则等
- 老王:这是个实物,是现实存在,和类的关系就是符合类的描述
对应到计算机术语,类就是class,定义了一些特点(属性 property)和行为(方法 method),比如说给隔壁制造惊喜的这类人有几个特征
- 长相文质彬彬,为人和善
- 姓王
同时这些人还有技能(行为)
- 帮隔壁修下水道
- 亲切问候对方儿子
我们刚才就描述了一个类,用代码表示就是
class LaoWang{
string name;
string familyNmae = "wang";
bool isKind = true;
LaoWang(string name){
this.name = name;
}
void fixPipe(){
statement
}
void greetSon(){
statement
}
}
符合这些特点并且有上述行为能力的,我们称之为老王,从描述我们就可以看出来LaoWang不是指某个人,而是指一类人,符合上述描述的都可能是老王!用计算机术语说就是每个活蹦乱跳的老王都是类LaoWang的实例。用代码描述就是
LaoWang lw1 = new LaoWang("yi");
LaoWang lw2 = new LaoWang("er");
...
LaoWang lw1000000 = new LaoWang("baiwan");
可以看出我们能够根据类LaoWang实例化出成千百万个老王来
JavaScript 对象
因为JavaScript是基于原型(prototype)的,没有类的概念(ES6有了,这个暂且不谈),我们能接触到的都是对象,真正做到了一切皆为对象
构造函数
“面向对象编程”的第一步,就是要生成“对象”。
前面说过,“对象”是单个实物的抽象。通常需要一个模板,表示某一类实物的共同特征,然后“对象”根据这个模板生成。
典型的面向对象编程语言(比如C++和Java),存在“类”(class)这个概念。所谓“类”就是对象的模板,对象就是“类”的实例。但是,JavaScript语言的对象体系,不是基于“类”的,而是基于构造函数(constructor)和原型链(prototype)。
JavaScript语言使用构造函数(constructor)作为对象的模板。所谓“构造函数”,就是专门用来生成“对象”的函数。它提供模板,描述对象的基本结构。一个构造函数,可以生成多个对象,这些对象都有相同的结构。
构造函数的写法就是一个普通的函数,但是有自己的特征和用法。
var Vehicle = function () {
this.price = 1000;
};
上面代码中,Vehicle就是构造函数,它提供模板,用来生成对象实例。为了与普通函数区别,构造函数名字的第一个字母通常大写。
构造函数的特点有两个。
- 函数体内部使用了this关键字,代表了所要生成的对象实例。
- 生成对象的时候,必需用new命令,调用Vehicle函数。
new 命令
基本用法
new命令的作用,就是执行构造函数,返回一个实例对象。
var Vehicle = function (){
this.price = 1000;
};
var v = new Vehicle();
v.price // 1000
new命令的原理
使用new命令时,它后面的函数调用就不是正常的调用,而是依次执行下面的步骤。
- 创建一个空对象,作为将要返回的对象实例
- 将这个空对象的原型,指向构造函数的prototype属性
- 将这个空对象赋值给函数内部的this关键字
- 开始执行构造函数内部的代码
- 返回this对象
构造函数的prototype属性
function Person(name){
this.name = name;
}
Person.prototype = {
getName: function(){
return this.name;
}
}
var person = new Person('xx');
person.getName(); //xx;
- prototype是一个对象
- 通过new Person 生成的对象, 能够访问到Person.prototype对象上的属性和方法
静态方法(属性)
function Person(){}
Person.fn = function(){
}
因为函数也是对象, 所以可以在它上面添加方法和属性,这些方法和属性与实例无关