面对对象 (工厂模式/构造函数/ instanceof /prototype)

这是一种编程思想
一般来说编程分两种:面向过程编程思想面向对象编程思想

应用题:有一辆车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();

由此可见,其实面对对象编程在游戏行业应该比较好用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值