宝哥软件园

玩JavaScript OOP——类实现详解

编辑:宝哥软件园 来源:互联网 时间:2021-10-28

摘要

当我们谈论面向对象编程时,我们在谈论什么?

我们首先讨论了一些概念:对象、类、封装、继承和多态性。

对象和类是面向对象的基础,封装、继承和多态是面向对象编程的三大特点。

JavaScript提供了对象,但缺少类,因此它不能像C#一样显式定义类。

但是JavaScript的功能非常灵活,其中一个就是构造函数,可以通过构造函数和原型对象的结合来实现“类”。

对象和类的概念。

目标

“对象”是面向对象编程中一个非常重要的概念,对象是对某物(某人或某物)的描述。

人和事来源于现实生活,我们对现实世界的认知就是我们对人和事的认知。

在编程领域,代码对普通人来说是抽象的,应用代码组合是为了更好地解决现实世界的问题。

在分析和设计阶段,使用“对象”的概念可以更好地反映现实世界中的问题。

相反,代码包含一些逻辑,用来描述业务,业务包含一些业务知识,这些知识是通过对现实世界的理解和分析总结出来的,这些问题是由现实世界的“对象”组成的。

对象包含特征和行为。在面向对象程序设计中,特征是对象的属性,行为是对象的方法。

种类

在现实世界中,相似的物体可以按照一定的标准进行分组。比如将“蜂鸟”和“鹰”归为鸟类,鸟类不是一个特定的对象,而是人们根据“蜂鸟”和“鹰”等特定鸟类分析相似的特征和行为后总结出来的概念。类相当于一个模板,我们可以基于这个模板创建不同的具体对象。

在C#中,我们可以定义一只鸟。

///summary////birds////summary公开课bird {public void fly () {console。writeline(‘我会飞!’。);}}虽然JavaScript是一种面向对象的编程语言,但它不提供类的语法支持。

在JavaScript中,一切都是基于对象的,甚至后面要描述的“原型”也是对象,JavaScript的继承和重用也是通过原型来实现的。

但是,结合构造函数和原型对象可以实现JavaScript“类”。

构造器

我们使用新的数组()创建了一个数组,使用新的对象()创建了一个对象。Array()和Object()是JavaScript的两个内置构造函数。虽然JavaScript不提供类,但是我们可以把它们理解为“类”的概念。

需要注意的是,JavaScript的“类”是由构造函数实现的。

定义构造函数

构造函数也是函数,定义构造函数和其他函数没有语法上的区别。

唯一不同的是构造函数的首字母要大写,这也是JavaScript的编程标准。

下面定义了一个Person()构造函数,我们可以将其理解为Person类。

function Person(){console.log('我是keep傻瓜'));}JavaScript的“类”和构造函数是同时定义的。在JavaScript中定义“类”时,同时定义了构造函数。

使用构造函数。

JavaScript使用类的方式与C#相同,新关键字后面跟一个构造函数。

var p=新人员();image

定义属性和方法。

现在我们已经定义了Person类,我们可以向Person类添加一些属性和方法。

定义属性

在讨论JavaScript对象时,我们讨论了对象属性的设置和访问。这段代码显示了定义对象属性的两种方法:

var cat={ color : ' black ' };猫名='汤姆';console . log(cat . color);console . log(cat . name);用它来定义属性。

JavaScript类的属性定义有些不同,这个关键字在构造函数中用来定义属性:

函数Person(name){ this . name=name;}第一行代码定义了Person类和构造函数。

第二行代码定义了name属性。

并创建对象。

下面两行代码创建了Person类的两个对象。

var p1=新人(“詹姆斯”);var p2=新人(' Cury ');在Chrome控制台中输出p1.name和p2.name。

image

P1和p2是两个不同的对象,修改p1.name不会影响p2.name。

p1.name='勒布朗詹姆斯';image

定义方法

首先,我们区分术语“功能”和“方法”。“函数”是一个独立的单位,“方法”则依赖于作为主体的类的存在。

用它来定义方法。

在JavaScript中,类的方法是在构造函数中定义的函数,这个关键字在构造函数中用来定义方法:

函数Person(name) {//定义了属性this.name=name//定义方法this . say hello=function(){ return ' hello,I is ' this . name;}}如何使用。

在Chrome控制台中调用p1和p2对象的sayHello()方法。

image

构造函数属性

创建对象时,JavaScript会自动为对象分配一个特殊属性,这个属性就是构造函数属性。在chrome控制台中输入p1.constructor,可以看到p1对象的constructor属性指向一个函数。

image

看看这个函数的内容。这不是Person()构造函数吗?

image

这意味着我们也可以通过p1.constructor属性创建对象。

var p3=新P1 . constructor(' Steve Nash ');这一行代码说明了一句话:“我不在乎p1对象是如何创建的,但我希望像p1一样创建另一个对象!”

image

使用Chrome控制台中的instanceof运算符,我们可以看到p1、p2和p3都是Person类的实例。

image

此外,当我们以{}的方式创建对象时,我们实际上调用了Object()构造函数。

var o={ };这一行代码声明了一个对象。虽然我们没有设置任何属性和方法,但是默认情况下,JavaScript引擎为它设置了构造函数属性。O.constructor指向Object()构造函数,[本机代码]显示Object()是JavaScript的内置函数。

image

原型对象

在JavaScript中,当定义一个函数时,它会有原型属性,构造函数也不例外。下图显示了Person()构造函数的原型属性是一个对象,属于函数。我们称这个属性为原型对象。从Person类的角度,我们也可以理解为原型属性属于Person类。

image

同时Person类的实例没有prototype属性,上图中的p1.prototype是未定义的,说明prototype属性是共享的,有点像C#中的静态属性。

设置原型。

因为prototype是一个对象,所以您可以向它添加属性和方法。

在函数的protpotype属性上定义属性和方法与设置普通对象的属性和方法没有什么不同。下面的代码定义了Person.prototype的属性和方法.

函数Person(name){ this . name=name;this . SayHello=function(){返回' Hello,我是' this.name} }//在构造函数的原型对象上定义Person.prototype.height=176的属性和方法;person . prototype . run=function(){ return ' I is ' this . name,我在跑!';} var P1=new Person(' James ');使用原型。

Person.prototype中定义的属性和方法可以被Person类的实例直接使用,并且仍然以object.property的方式使用

image

特别是,name和sayHello()是属于Person类的实例,而height和run()是不属于Person类的实例。

image

提示:您可以通过hasOwnProperty方法检查对象是否包含属性或方法。

自有属性与原型属性。

Person类的实例既可以使用Person类中的属性,也可以使用Person.prototype中的属性。那么Person类的属性和Person.prototype的属性有什么区别呢?

首先,我们可以将Person类中的属性和方法理解为“实例属性”。由于原型是共享的,我们可以把原型中的属性和方法理解为“共享属性”。

“实例属性”和“共享属性”的区别主要体现在性能上。每次创建Person的实例时,都会生成name属性和sayHello()方法的副本,而height属性和run()方法将由所有实例共享。

在这种情况下,这意味着可以在原型中提到sayHello()方法。此外,不同Person实例的高度可能不同,因此将其放在Person类中更为合理。

函数Person(姓名、身高){ this.name=namethis.height=高度;} person . prototype . say Hello=function(){ return ' Hello,我是' this.name ',我的身高是' this.height 'cm ';} person . prototype . run=function(){ return ' I is ' this . name,我在跑!';}var p1=new Person('James ',203);var p2=新人(' Cury ',190);

image

班级实施总结。

JavaScript没有类,但是构造函数可以实现“类”。

根据JavaScript编程规范,构造函数的首字母应该大写。

“类”的属性和方法是以这种方式在构造函数中定义的。

创建对象时,JavaScript将构造函数属性分配给对象,该属性是对象构造函数的引用。

定义函数时,它已经有了原型属性,这也是一个对象。

原型是共享的,在原型上定义的属性和方法可以被“类”的实例使用。

如果属性或方法可以在原型上定义,它们就不应该在构造函数上定义。使用原型可以减少内存开销。

以上关于JavaScript OOP类实现的详细讲解,都是边肖跟大家分享的内容,希望能给大家一个参考,多支持我们。

更多资讯
游戏推荐
更多+