这是一种编程思想
一般来说编程分两种:面向过程编程思想和面向对象编程思想
应用题:有一辆车60km/h,跑在一条1000km的公路上,问,车跑完这条路需要多长时间?
//面对过程
var hour = 1000 / 60;
alert(hour);//16.666666666666668
//面对对象
var car = {
speed: 60,
run: function(road){
return road.length / car.speed;
}
}
var road1 = {
length: 1000
}
var hours = car.run(road1);
alert(hours);//16.666666666666668
一样的结果,面对对象这个代码这么多,而且还难,我们为什么要用面对对象呢。
有概念叫做类和对象,类和对象是实现面向对象程序的语法基础
ECMA6里加入了类的语法。
在数据结构上,也有层次之分
基本数据类型(存储单个值) => 数组(处理批量数据) => 对象(既能够存储数据、还能够存储函数)
我们先来学习创建对象:
//创建一男一女
var person1 = new Object();
person1.name = "blue";
person1.sex = '男';
person1.showName = function(){
alert("我叫" + this.name);
}
person1.showSex = function(){
alert("我是" + this.sex + '的');
}
person1.showName();//我叫blue
person1.showSex();//我是男的
//创建一个叫做red的女性
var person2 = new Object();
person2.name = "red";
person2.sex = '女';
person2.showName = function(){
alert("我叫" + this.name);
}
person2.showSex = function(){
alert("我是" + this.sex + '的');
}
person2.showName();//我叫red
person2.showSex();//我是女的
创建完了,但我们觉得很多代码,有重复很麻烦,本着代码无重原则我们简化代码,下面是工厂模式
工厂模式
工厂顾名思义,三大步骤:1、原料 。2、加工 。3、出厂。
//这个函数就是工厂,负责加工。
function createPerson(name, sex){
//1、原料
var person = new Object();
//2、加工
//添加属性和方法
person.name = name;
person.sex = sex;
person.showName = function(){
alert("我叫" + this.name);
}
person.showSex = function(){
alert("我是" + this.sex + "的");
}
//3、出厂
return person;
}
var p1 = createPerson("blue", "男");
p1.showName();//我叫blue
p1.showSex();//我是男的
var p2 = createPerson("red", '女');
p2.showName();//我叫red
p2.showSex();//我是女的
alert(p1.showName == p2.showName); //false
函数加工完了,但我们发现了一个问题,比较这两个函数发现他们不是同一方法的,也就是说如果对象变多那么就会一个个占位置,如何让他们统一呢。
这里要了解官方如何创建对象
var arr1 = new Array(1, 2, 3);
var arr2 = new Array(4, 5, 6);
alert(arr1.push === arr2.push); //true
我们能够发现,官方new创造的是同一类对象用的同一类函数。
那我们先实现用new创建
构造函数
如果函数被new调用,那么这个函数里的this指向当前创建的新对象。(自动完成 1、原料 和 3、出厂操作)
我们为了区分这种函数和别的函数,我们把这种函数叫做构造函数,构造函数的首字母一般情况下大写。
构造函数是用来构造对象的。
function Person(name, sex){
//2、加工
//添加属性和方法
this.name = name;
this.sex = sex;
this.showName = function(){
alert("我叫" + this.name);
}
this.showSex = function(){
alert("我是" + this.sex + "的");
}
}
var p1 = new Person("blue", "男");
p1.showName();
p1.showSex();
var p2 = new Person("red", '女');
p2.showName();
p2.showSex();
alert(p1.showName == p2.showName); //false
虽然我们成功利用new创造了对象,但依然不是同一对象的。
这里我们学了构造函数,有个小知识。
instanceof
判断当前对象是否是这个构造函数创建的。
var arr = new Array(1, 2, 3, 4);
alert(arr instanceof Date);
如果我们想给一类的对象,添加方法,那么我们可以通过原型prototype,
将这个方法添加给这个对象的构造函数。
prototype
下面代码是给数组创建一个求和方法。
Array.prototype.sum = function(){
var res = 0;
for(var i = 0; i < this.length; i++){
res += this[i];
}
return res;
}
var arr1 = [10, 20, 30, 40, 50];
var arr2 = [1, 2, 3, 4, 5];
alert(arr1.sum());//150
alert(arr2.sum());//15
alert(arr1.sum === arr2.sum); //true
这样我们就封装完了,而且我们发现他是同一方法创建的。
编写一个构造函数,在没有类的时间段,我们使用构造函数,充当类的存在。
function Person(name, sex){
this.name = name;
this.sex = sex;
}
//添加方法
Person.prototype.showName = function(){
alert("我叫" + this.name);
}
Person.prototype.showSex = function(){
alert("我是" + this.sex);
}
var p1 = new Person("blue", "男");
p1.showName();
p1.showSex();
var p2 = new Person("red", '女');
p2.showName();
p2.showSex();
alert(p1.showName === p2.showName); //true
利用所学的方法我们可以再随机写例子,比如英雄联盟,我们创建一些对象。
function Hero(HP, MP, name, address){
this.HP = HP;
this.MP = MP;
this.name = name;
this.address = address;
}
Hero.prototype.blink = function(){
alert("闪现");
}
Hero.prototype.showSelf = function(){
alert(`我是${this.name},我来自于${this.address},是的血量是${this.HP},我的能量是${this.MP}`);
}
var lanbo = new Hero(400, 0, "兰博", "约德尔");
lanbo.showSelf();
lanbo.blink();
var anni = new Hero(500, 400, "安妮", "瓦罗兰");
anni.blink();
anni.showSelf();
由此可见,其实面对对象编程在游戏行业应该比较好用。