基于JavaScript 的面向对象语言特性及其程序设计

2019-11-29 14:29李胜
科技与创新 2019年6期
关键词:多态面向对象原型

李胜

(西南石油大学,四川 成都 610500)

在实际操作过程中,很多程序员熟练掌握各种框架设计,但是对代码组织却不尽理想,这是因为很多程序设计人员对JavaScript 的语言特性了解不够透彻,关于JavaScript面对对象语言特性的参考文献少之又少,有些文献提出的JavaScript 面向对象的观点理解的还有所偏差。基于此,本研究将重点针对如何真正理解JavaScript 面向对象语言特性展开讨论,结合JavaScript 自身的特点对其面向对象特性进行分析,以提高程序设计的设计标准。

1 面向对象程序设计的本质

封装、继承、多态作为面向对象基本的语言特性,对事物的具体结构进行描述以帮助人们能够更好地理解知识,将复杂的知识形象化,其中,封装的本质是为了隐藏信息,将对象的属性和方法组成整体,通过传递消息的方式访问对象;继承则是在类的基础上生成新的类,以实现代码的操作;多态则是通过调用的方式呈现出不同的对象,让程序变得更加简洁。

除了这三类基本的语言特性外,还有对象、属性、行为和类,这些都是编程语言中的基础特性。在面向对象的编程思想中,对象的作用非常重要,对象在程序设计语言中是客观事物的表现形式;属性是事物的静态特征;行为是事物的动作;类是将相同属性的对象进行集合。类更是一种模板,对象则是在类这个模板中所创造出来的产物。

2 JavaScript 与传统基于类的面向对象比较

在基于类的表达方式中,可以通过类的方式创建多个属性和行为,然后通过创建出来的属性和行为对类进行表达,在早期ECMAScirpt 中没有对类进行阐述,ECMA-262 就是将对象定义成了无序属性所构成的集合,并且该集合中有基本值和对象。当JavaScript 转给你包含了数值时,数值可以表示数据,也可以表示函数。当表示数据时,是属性,反之是行为。这种基于原型的面向对象方法主要是通过构造器的方式对相应的对象进行构造,比如生产机动车,人为制造与机械制造的思维方式肯定有所不同,机械工程师会先将机动车的图纸设计出来,根据设计原型对制作工艺进行详细规定,工人们只需要按照图纸进行生产即可。而使用程序设计如何表示,设计好的图纸就好似面向对象中的类,而机动车就是这个类中的对象,工人和机器就是利用各种零件将机动车进行制造,制造机动车的零件就是面向对象中的属性,机器表示函数。

在实际的应用中,任何一个对象的产生都会通过其他已经存在的对象进行结合,从而形成一个构造的结果,单单依靠一张图纸是无法设计出机动车的。类是一个抽象的概念,而对象是一个实际存在的物体,如果按照最基本的面向对象的原则进行分析,类不仅仅是一个对象。处于原型中的构造器并不会构造出对象,而是通过更加简单的方式表述对象,让人们能够对这个世界报以更加客观的态度,从而更好地体现出面向对象的思想。在基于类的面相对性的语言中,对象是由一个个单独的对象组成,而行为和方法都需要通过类进行声明,让类独自拥有。在继承的过程中,对象有一个从属关系,子类对象只能继承父类对象。在基于原型的面向对象语言中,对象包含了行为与属性,并且能够同时继承对象与属性,也更加符合事物的发展规律。因此,面向对象的编程思想中,可以对类进行使用,同时还可以通过其他的方式对类进行表述。其中,JavaScript 就是一种非常合适的例子,在了解这一观点后,需要通过实际的案例说明JavaScript 如何实现面向对象的特性。

3 基于JavaScript 的面向对象语言特性的程序设计

3.1 封装

封装作为面向对象的重要特性之一,主要的作用是针对开发者,当对象在公布外部接口后会隐藏内部功能,从而起到保护私有数据的作用。JavaScript 既是一种无类的语言,又是一种函数式语言,构造函数需要使用一种新的操作方式创建对象,比如new 操作符,如果调用者没有使用new 操作符,构造函数会继续执行程序,并且不会出现报错。因此,在JavaScript 程序中构造函数的首字母需要是大写,强制提醒调用者进行使用。针对构造函数中存在的不足,可以使用函数化的形式表示对象,能够避免操作中可能会出现的隐患,通过闭包的方式隐藏私有成员。通过一个具体的实例讨论JavaScript 如何实现封装特性:

var Book=function(id,name,price){

var num=1;

// 私有方法

function checkId(){};

// 特权方法

this.getName=function(){};

this.setPrice=function(){};

this.getName=function(){};

this.setPrice=function(){};

// 对像公有属性

this.id=id;

// 对象公有方法

this.copy=function(){};

// 构造器

this.setName(name);

this.setPrice(price);

}

类的内部this 中所定义的属性和方法能够被复制,并将类的属性和方法应用在新的对象中,将其称为公有化,同时还可以访问私有的属性和方法,这种方式就叫作特权方法。可以通过以下方式进行调用:

var book=new Book(11, '设计模式', 50);

console.log(b.num); //undefined

console.log(b.id); //11

3.2 继承

JavaScript 并不具备继承的相关含义,同时也没有对抽象类的参数进行定义,JavaScript 是通过语言的特性实现继承的功能,JavaScript 支持多重继承,实现继承的方式有很多,比如类式继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承、多继承等。每一个类有三部分组成,构造函数内、构造函数外以及类的原型。类式继承一般是通过子类的原型而实现的,其中类式继承主要是通过子类的原型prototype 对象实例化而实现的,如:

function Parent(name){this.name=name; }

Parent.prototype.say=function(){

console.log(this.name+'say');

};

function Child(name){

Parent.call(this, name);

}

Child.prototype.say=function(){

console.log('Child'+this.name+'say');

};

const child=new Child('Ben');

3.3 多态

方法的重载和覆盖可以实现面向对象的多态性,重载就是可以通过多种不同的方式实现相同的含义,并对参数的类型进行有效的识别,JavaScript 在定义函数时不需要对函数参数的类型进行识别,JavaScript 本身就支持重载。通过对传递的参数判断执行逻辑,实现一种多态处理机制,通过多态类调用add 运算方法,根据不同的参数进行运算。

function Add(){

// 无参数算法

function zero(){

return 0;

}

// 一个参数的算法

function one(num){

return 10+num;

}

// 两个参数的算法

function two(num1, num2){

return num1+num2;

}

this.add=function(){

var args=arguments;

var len=args.length;

switch(len){

case 0:

return zero();

case 1:

return one(args[0]);

case 2:

return two(args[0], args[1]);

}

}

}

// 实例化

var A=new Add();

console.log(A.add()); //10

console.log(A.add(5)); //15

console.log(A.add(6, 7)); //13

4 结束语

传统的基于类的面向对象思维具有一定的理解难度,本文通过实例了解了面向对象程序设计,深入分析了面向对象的语言特性和编程,并对面向对象的特性进行了阐述,简单实用,容易理解,具有非常高的灵活性。

猜你喜欢
多态面向对象原型
GEE平台下利用物候特征进行面向对象的水稻种植分布提取
基于深度学习与融合地形特征的黄土陷穴面向对象提取方法
包裹的一切
《哈姆雷特》的《圣经》叙事原型考证
人人敬爱的圣人成为了 传说人物的原型
面向对象程序设计中多态性探讨
Java语言中方法重载与方法覆盖的异同
《C++面向对象程序设计》中引用类型的教学实践
基于Web的科研项目管理系统的设计与实现
论《西藏隐秘岁月》的原型复现