JavaScrip-->面向对象编程

面向对象编程

javascript语言中一切皆为对象!

对象究竟是什么?什么叫面向对象编程?

对象(object),台湾译作物件,是面向对象(Object Oriented)中的术语,既表示客观世界问题空间(Namespace)中的某个具体的事物,又表示软件系统解空间中的基本元素。

在软件系统中,对象具有唯一的标识符,对象包括属性(Properties)和方法(Methods),属性就是需要记忆的信息,方法就是对象能够提供的服务。在面向对象(Object Oriented)的软件中,对象(Object)是某一个类(Class)的实例(Instance)。 —— 维基百科

对象是从我们现实生活中抽象出来的一个概念,俗话说物以类聚,人以群分,我们也经常说有一类人,他们专业给隔壁家制造惊喜,也就是我们说的老王

这里面就有两个重要概念

  1. 类:无论是物以类聚,还是有一类人,这里说的类并不是实际存在的事物,是一些特征、是一些规则等
  2. 老王:这是个实物,是现实存在,和类的关系就是符合类的描述

对应到计算机术语,类就是class,定义了一些特点(属性 property)和行为(方法 method),比如说给隔壁制造惊喜的这类人有几个特征

  1. 长相文质彬彬,为人和善
  2. 姓王

同时这些人还有技能(行为)

  1. 帮隔壁修下水道
  2. 亲切问候对方儿子

我们刚才就描述了一个类,用代码表示就是

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(){

}

因为函数也是对象, 所以可以在它上面添加方法和属性,这些方法和属性与实例无关

你可能感兴趣的:(JavaScrip-->面向对象编程)