您当前的位置:首页 > 互联网百科 > 游戏

游戏开发之旅-JavaScript面向对象编程OOP

时间:2020-08-04 16:01:36  来源:  作者:

本节是第四讲的第十四小节,上一节我们为大家介绍了JAVAScript对象的基础概念,本节为大家介绍JavaScrip面向对象编程(OOP)以及构造函数等概念。

面向对象的程序设计(Object-oriented programming,OOP)

OOP 的基本思想是:在程序里,我们通过使用对象去构建现实世界的模型,把原本很难(或不可)能被使用的功能,简单化并提供出来,以供访问。对象可以包含相关的数据和代码,这些数据和代码用于表示 你所建造的模型是什么样子,以及拥有什么样的行为或功能。对象包(object package,或者叫命名空间 namespace)存储(官方用语:封装)着对象的数据(常常还包括函数),使数据的组织和访问变得更容易了;对象也常用作 数据存储体(data stores),用于在网络上运输数据,十分便捷。

定义一个对象模板(Object template)

让我们来考虑一个简单的程序,它可以显示一个学校的学生和老师的信息.在这里我们不讨论任何程序语言,我们只讨论 OOP 思想。

首先,我们可以回到上一节拿到定义好属性和方法的Person对象。对于一个人(person)来说,我们能在他们身上获取到很多信息(他们的住址,身高,鞋码,基因图谱,护照信息,显著的性格特征等等),然而,我们仅仅需要他们的名字,年龄,性别,兴趣 这些信息,然后,我们会基于他们的这些信息写一个简短的介绍关于他们自己,在最后我们还需要教会他们打招呼。以上的方式被称为抽象-为了我们编程的目标而利用事物的一些重要特性去把复杂的事物简单化。

游戏开发之旅-JavaScript面向对象编程OOP

 

在一些面向对象的语言中,我们用类(class)的概念去描述一个对象(您在下面就能看到JavaScript使用了一个完全不同的术语)-类并不完全是一个对象,它更像是一个定义对象特质的模板。

创造一个真正的对象

从上面我们创建的class中, 我们能够基于它创建出一些对象 - 一些拥有class中属性及方法的对象。基于我们的Person类,我们可以创建出许许多多的真实的人:

游戏开发之旅-JavaScript面向对象编程OOP

 

当一个对象需要从类中创建出来时,类的构造函数就会运行来创建这个实例。这种创建对象的过程我们称之为实例化-实例对象被类实例化。

具体的子类

在这个例子里,我们不想要泛指的人,我们想要像老师和学生这样类型更为具体的人。在 OOP 里,我们可以创建基于其它类的新类,这些新的子类可以继承它们父类的数据和功能。比起复制来说这样能够使用父对象共有的功能。如果类之间的功能不同,你可以根据需要定义专用的特征。

游戏开发之旅-JavaScript面向对象编程OOP

 

这是非常有用的,老师和学生具有一些相同的特征比如姓名、性别、年龄,因此只需要定义这些特征一次就可以了。您可以在不同的类里分开定义这些相同的特征,这样该特征会有一个不同的命名空间。比如,一个学生的 greeting 可以是 "Yo, I'm [firstName]" (例子 Yo, I'm Sam),老师的可能会正式一些,比如"Hello, my name is [Prefix] [lastName]" (例子 Hello, My name is Mr Griffiths)。

Note:多态(polymorphism)—这个高大上的词正是用来描述多个对象拥有实现共同方法的能力。

具体的对象

现在可以根据子类创建对象。

游戏开发之旅-JavaScript面向对象编程OOP

 

构建函数(Constructor Functions)和对象

有些人认为 JavaScript 不是真正的面向对象的语言,比如它没有像许多面向对象的语言一样有用于创建class类的声明。JavaScript 用一种称为构建函数(constructor functions)的特殊函数来定义对象和它们的特征。构建函数非常有用,因为很多情况下您不知道实际需要多少个对象(实例)。构建函数提供了创建您所需对象(实例)的有效方法,将对象的数据和特征函数按需联结至相应对象。

不像“经典”的面向对象的语言,从构建函数创建的新实例的特征并非全盘复制,而是通过一个叫做原形链的参考链链接过去的。所以这并非真正的实例,严格的讲, JavaScript 在对象间使用和其它语言的共享机制不同。

Note:“经典”的面向对象的语言就像上面提到的,OOP 可能很快就变得非常复杂,JavaScript 找到了在不变的特别复杂的情况下利用面向对象的优点的方法。

一个简单的例子

function Person(name) {

this.name = name;

this.greeting = function() {

alert('Hi! I'm ' + this.name + '.');

};}

var person1 = new Person('Bob');

var person2 = new Person('Sarah');

person1.name

person1.greeting()

person2.name

person2.greeting()

这个构建函数是 JavaScript 版本的类。您会发现,它只定义了对象的属性和方法,除了没有明确创建一个对象和返回任何值和之外,它有了您期待的函数所拥有的全部功能。这里使用了this关键词,即无论是该对象的哪个实例被这个构建函数创建,它的 name 属性就是传递到构建函数形参name的值,它的 greeting() 方法中也将使用相同的传递到构建函数形参name的值。

Note: 一个构建函数通常是大写字母开头,这样便于区分构建函数和普通函数。

页面上有两个对象,每一个保存在不同的命名空间里,当您访问它们的属性和方法时,您需要使用person1或者person2来调用它们。尽管它们有着相同的name属性和 greeting()方法它们是各自独立的,所以相互的功能不会冲突。注意它们使用的是自己的 name 值,这也是使用 this 关键字的原因,它们使用的从实参传入形参的自己的值,而不是其它的什么值。

创建最终的构造函数

function Person(first, last,gender) {

this.name = {

'first': first, 'last': last

};

this.gender = gender;

this.greeting = function() {

alert('Hi! I'm ' + this.name.first + '.');

};

}

let person1 = new Person('Bob', 'Smith', 'male');

Object()构造函数

到现在为止,我们了解到了两种不同的创建对象的方式 —— 声明一个对象的语法, 与使用构造函数。使用Object()构造函数来创建一个新对象。 是的, 一般对象都有构造函数,它创建了一个空的对象。

常见有两种创建方式,第一种如下:

var person1 = new Object();

person1.name = 'Chris';

person1['gender'] = 'male';

person1.greeting = function() {

alert('Hi! I'm ' + this.name + '.');

}

还有一种如下:

var person1 = new Object({

name : 'Chris',

gender: 'male',

greeting : function() {

alert('Hi! I'm ' + this.name + '.');

}});

JavaScript有个内嵌的方法create(), 它允许您基于现有对象创建新的对象。person2是基于person1创建的, 它们具有相同的属性和方法。这非常有用, 因为它允许您创建新的对象而无需定义构造函数。缺点是比起构造函数,浏览器在更晚的时候才支持create()方法(IE9, IE8 或甚至以前相比), 加上一些人认为构造函数让您的代码看上去更整洁 —— 您可以在一个地方创建您的构造函数, 然后根据需要创建实例, 这让您能很清楚地知道它们来自哪里。例如:

var person2 = Object.create(person1);

以上内容部分摘自视频课程04网页游戏编程JavaScript-14面向对象编程,更多示例请参见网站示例。跟着张员外讲编程,学习更轻松,不花钱还能学习真本领。



Tags:游戏   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
从游戏变成大家喜爱的电竞,再到有文化创意内涵的体育运动赛事,电竞正在以全新的面貌进入大众视野。电竞市场规模不断增长也带来对专业人才的需求,全国共计百余家高职院校与十余...【详细内容】
2022-07-06  Tags: 游戏  点击:(12)  评论:(0)  加入收藏
去年,整个视频游戏行业的销售额又创下了新纪录,现在已经超过 1300 亿美元(和疫情有关系吗?)。 以下按2021的游戏收入列出了 2022 年全球最大的 10 家视频游戏公司。这个排名只...【详细内容】
2022-06-17  Tags: 游戏  点击:(196)  评论:(0)  加入收藏
6月2日,据微信团队官方更新公告,为了提升小程序/小游戏的使用效率,在本次开发中新增FD接口,可以提高文件存取读写速度。 (图片来自:微信开发者公众号) FD接口是微信团队新增的高性...【详细内容】
2022-06-02  Tags: 游戏  点击:(32)  评论:(0)  加入收藏
太空游戏在目前种类越来越多,最早期的代表作是《质量效应》和《死亡空间》等,那本期就来为大家整合推荐7款,必玩的太空题材游戏大作。 《使命召唤13》 《使命召唤13》这个系列...【详细内容】
2022-05-13  Tags: 游戏  点击:(43)  评论:(0)  加入收藏
新冠疫情令我错失了与朋友们见面、讨论和玩纸牌游戏的机会。 Zoom 可以解决一些燃眉之急,但怎么玩纸牌游戏呢?怎么玩我们的Scopone呢? 于是,我决定开发一款可以与朋友们一起...【详细内容】
2022-05-06  Tags: 游戏  点击:(46)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的Nakama是一个开源在线多人游戏框架。 Nakama 是一个开...【详细内容】
2022-04-13  Tags: 游戏  点击:(148)  评论:(0)  加入收藏
一季度安徽12315接收投诉举报咨询25万余件豪掷5万余元拆盲盒,却连“隐藏款”的影子都没见到;看直播被“卖惨”感动,买来的珍珠却是次品……记者4月11日从省市场监...【详细内容】
2022-04-12  Tags: 游戏  点击:(61)  评论:(0)  加入收藏
4月11日,国家新闻出版署官网显示,2022年4月首批国产游戏版号已经下发,共45款国产网络游戏获批,其中包括37款移动端游戏,5款客户端游戏,2款休闲益智类手游,1款Switch游戏。易观分析...【详细内容】
2022-04-12  Tags: 游戏  点击:(46)  评论:(0)  加入收藏
  科技的演进在不断丰富人们生活体验的同时,也在拓展着个人资产的边界。相对于房屋、汽车等有形、有明确价值的资产,手机号、游戏里的装备、各种平台“钱包”中的余额乃至日...【详细内容】
2022-04-07  Tags: 游戏  点击:(56)  评论:(0)  加入收藏
为进一步提升全民识骗防骗意识,哈尔滨市公安局反电信网络诈骗中心针对疫情防控期间多发的电信网络诈骗套路进行揭秘,帮助大家识破骗局,共同筑牢防疫和反诈“双免疫”。今天,揭秘...【详细内容】
2022-04-06  Tags: 游戏  点击:(146)  评论:(0)  加入收藏
▌简易百科推荐
今年Switch会有多款大作发售,《宝可梦 珍珠钻石》、《怪物猎人 崛起》可能还有大家翘首以盼的《荒野之息2》等游戏。触动了许多玩家的游戏欲望,于是最近有不少玩家纷纷购入了S...【详细内容】
2021-03-29      Tags:Switch   点击:(188)  评论:(0)  加入收藏
随着互联网的发展,网络游戏也进入了新时代,我们国内的玩家可以通过steam、战网、等平台,能玩到各式各样的外服,甚至国际服的网络游戏,这些网游中,有的可以免费体验,有的也是买断性...【详细内容】
2020-09-21      Tags:网络游戏   点击:(106)  评论:(0)  加入收藏
《荒野大镖客OL》如同R星的兄弟作品《侠盗猎车OL》一样,规模是非常巨大的。同时运营这两款大型多人游戏,意味着可能遭遇无数个状况,比如各种导致游戏无法进行下去的bug,还有一些...【详细内容】
2020-09-21      Tags:《荒野大镖客OL》   点击:(156)  评论:(0)  加入收藏
编者按:今年8月,游戏引擎公司Unity Software(以下简称Unity)提交上市申请,计划在纽约证券交易所上市,股票代码为「U」,主承销商为高盛和瑞士信贷。根据Unity最新(9月16日)提交SEC的文...【详细内容】
2020-09-18      Tags:游戏引擎   点击:(115)  评论:(0)  加入收藏
热爱电竞的男孩都有过一个梦想,成为职业选手,拿到全国冠军。在南京,5个男孩组成高校电竞队,互为伙伴和对手,一起向冠军奔去。像一种青春样本,他们代表着的,是所有游戏迷在少年时代...【详细内容】
2020-09-15      Tags:职业电竞   点击:(132)  评论:(0)  加入收藏
Age of Empires 2 Definitive Edition(帝国时代2 决定版),是微软经典即时策略游戏《帝国时代2》完全重制版,原作最早在1999年推出,决定版在20周年纪念时推出,全新制作了4K超高清...【详细内容】
2020-09-14      Tags:《帝国时代2》   点击:(283)  评论:(0)  加入收藏
随着时间的流逝,绝地求生终于迎来了新版本的更新,在9月9日晚测试服推送了更新包,并且官方也发布了测试服的更新公告。 这次更新最主要的就是加入了蓝圈背包,目前这个道具只在雨...【详细内容】
2020-09-11      Tags:绝地求生   点击:(187)  评论:(0)  加入收藏
对于玩家来说,最容易影响游戏帧数表现的一个电脑部件,应该就是显卡了。CPU虽然也同样对于帧数有很大影响,但是对比起CPU,绝大多数显卡都不会要求玩家花钱换主板,而且安装更加简易...【详细内容】
2020-09-09      Tags:NVIDIA   点击:(189)  评论:(0)  加入收藏
王者荣耀正式服将在8号迎来新一轮的周更,此次更新不仅有新皮肤、新福利上线和碎片商店换新, 还涉及了5位英雄的调整,同时官方还修复了铠2技能击退距离异常,以及2/3技能衔接强化...【详细内容】
2020-09-08      Tags:王者荣耀   点击:(130)  评论:(0)  加入收藏
感谢猴子提供的测试机会。大家好,好久不见,我是泰莉亚!最近热点上网冲浪实在是太难了,产出的内容少了不少,如果还有什么想看的东西可以留言,我会上游戏尽量为大家解答~...【详细内容】
2020-09-01      Tags:魔兽9.0   点击:(218)  评论:(0)  加入收藏
站内最新
站内热门
站内头条