## JavaScript 语言:通过一种叫做 原型(prototype)的方式来实现面向对象编程
### 1.万物皆对象
> **在基于类的面向对象方式中,对象(object)依靠 类(class)来产生。而在基于原型的面向对象方式中,对象(object)则是依靠 构造器(constructor)利用 原型(prototype)构造出来的。举个客观世界的例子来说明二种方式认知的差异。例如工厂造一辆车,一方面,工人必须参照一张工程图纸,设计规定这辆车应该如何制造。这里的工程图纸就好比是语言中的 类 (class),而车就是按照这个 类(class)制造出来的;另一方面,工人和机器 ( 相当于 constructor) 利用各种零部件如发动机,轮胎,方向盘 ( 相当于 prototype 的各个属性 ) 将汽车构造出来。**
* 对象是单个实物的抽象。
~~~
一本书、一辆汽车、一个人都可以是对象,一个数据库、一张网页、一个与远程服务器的连接也可以是对象。当实物被抽象成对象,实物之间的关系就变成了对象之间的关系,从而就可以模拟现实情况,针对对象进行编程。
~~~
* 对象是一个容器,封装了属性(property)和方法(method)
~~~
属性是对象的状态,方法是对象的行为(完成某种任务)。比如,我们可以把动物抽象为animal对象,使用“属性”记录动物的颜色\种类,使用“方法”表示动物的某种行为(奔跑、捕猎、休息等等)。
~~~
### 2.面向对象第一步:生成对象
* 典型的面向对象编程语言(比如 C++ 和 Java),都有“类”(class)这个概念。所谓“类”就是对象的模板,对象就是“类”的实例
* 而Javascript在es6之前没有类这个概念,Javascript使用构造函数来模拟Java中的类;
构造函数:eg:
~~~
var Person = function(name,age){
this.name = name;
this.age = age;
}
~~~
> 构造函数函数体内部使用了this关键字,代表了所要生成的对象实例。
> **生成对象时,必须使用new命令**
eg:
~~~
var pi= new Person("xiaopi",19)
~~~
> 调用对象的属性
eg:
~~~
console.log(pi.name);//xiaopi
console.log(pi.age); //19
~~~
> **new命令的原理**
* 使用new命令时,它后面的函数依次执行下面的步骤。
1.创建一个对象实例
2.实例化对象的原型指向构造函数的原型对象
3.将这个对象赋值给构造函数的this