手机版

详细说明Javascript定义类的三种方法

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

将近20年前,当Javascript诞生时,它只是一种简单的网络脚本语言。如果忘记填写用户名,会弹出警告。

如今,它已经变得几乎无所不能,从前端到后端,有各种不可思议的用途。程序员用它来完成越来越大的项目。

Javascript代码的复杂性也直线上升。一个网页包含10,000行Javascript代码,这早已司空见惯。2010年,有工程师爆料Gmail的代码长度为44.3万行!

为了编写和维护如此复杂的代码,我们必须使用模块化策略。目前行业主流做法是采用面向对象编程。因此,如何用Javascript实现面向对象编程成为一个热门话题。麻烦的是Javascipt语法不支持‘class’,导致传统的面向对象编程方法无法直接使用。程序员在研究如何用Javascript模拟“类”方面做了很多探索。总结了Javascript中定义“类”的三种方法,讨论了每种方法的特点,重点介绍了我眼中最好的方法。

==============================================

Javascript中定义类的三种方法。

在面向对象编程中,类是对象的模板,它定义了由同一组对象(也称为“实例”)共享的属性和方法。

Javascript不支持‘类’,但可以通过一些灵活的方法进行模拟。

首先,构造函数方法。

这是一种经典的方法,也是教材中必不可少的教学方法。它用构造函数模拟' class ',并在内部用这个关键字引用实例对象。复制的代码如下:函数Cat() {this.name='大毛';}生成实例时,使用new关键字。复制代码如下: var cat1=new Cat();alert(cat1 . name);//浓密的头发

类的属性和方法也可以在构造函数的原型对象上定义。复制代码如下: cat . prototype . make sound=function(){ alert('喵喵');}关于这个方法的详细介绍,请看我的系列文章《Javascript 面向对象编程》,这里就不多说了。它的主要缺点是复杂,而且用的是这个和原型,所以写和读都很费力。

其次是Object.create()方法。

为了克服“构造函数方法”的缺点,更方便地生成对象,国际Javascript标准ECMAScript第五版(目前为第三版)提出了一种新方法Object.create()。这样,“类”就是一个对象,而不是函数。复制的代码如下:var Cat={name:' DAMAO ',makesond 3360 function(){ ALERT('喵喵');}};

然后,直接使用Object.create()生成一个实例,而不使用new。复制代码如下: var cat1=object . create(Cat);alert(cat1 . name);//大毛cat1 . make sound();//喵喵喵。

目前各大浏览器的最新版本(包括IE9)都部署了这种方法。如果遇到旧浏览器,可以使用以下代码自行部署。复制的代码如下:if(!object . create){ object . create=function(o){ function F(){ } F . prototype=o;返回新的F();};}这种方法比‘构造函数方法’简单,但不能实现私有属性和方法,不能在实例对象之间共享数据,所以对‘类’的模拟不够全面。

第三,极简法则。

荷兰程序员Gabor de Mooij提出了一种比Object.create()更好的新方法,他称之为“极简方法”。这也是我推荐的方法。

3.1包装。

这种方法不使用这个和原型,代码部署起来非常简单,这大概就是它被称为‘极简主义’的原因。

首先,它还用一个对象模拟一个“类”。在这个类中,定义一个构造函数new new()来生成一个实例。复制的代码如下:VARCAT={新建: function(){//这里有些代码} };

然后,在new new()中,定义一个实例对象,并将这个实例对象作为返回值。复制代码如下: var cat={ create new 3360 function(){ var cat={ };Cat.name='大毛';Cat.makeSound=function(){ alert('喵喵');};还猫;}};

当使用时,调用NewLeave()方法,就可以获得实例对象。复制代码如下: var cat1=cat . new new();cat1 . MakeSound();//喵喵喵。

这种方法的优点是易于理解,结构清晰优雅,符合“面向对象编程”的传统结构,因此可以方便地部署以下功能。

3.2继承

让一个类继承另一个类非常方便。在前者的New()方法中,调用后者的New()方法。

首先,定义一个动物类。复制的代码如下: VARAMAL={ CREATE NEW : function(){ VARAMAL={ };Animal.sleep=function(){ alert('晚睡');};归还动物;}};

然后,在Cat的New new()方法中,调用Animal的new()方法。复制代码如下: varcat={ create new 3360 function(){ varcat=animal . new();Cat.name='大毛';Cat.makeSound=function(){ alert('喵喵');};还猫;}};生成的猫实例将继承猫类和动物类。复制代码如下: var cat1=cat . new new();cat1 . sleep();//睡懒觉。

3.3私有属性和方法。

在new new()方法中,只要没有在cat对象上定义方法和属性,它们都是私有的。复制代码如下: var cat={ create new 3360 function(){ var cat={ };Var声音='喵喵喵';cat.makeSound=function(){ alert(声音);};还猫;}};在内部变量声音上,外部无法读取,只能通过cat的公共方法makeSound()来读取。复制代码如下: var cat1=cat . new new();警报(cat 1 . sound);//未定义

3.4数据共享。

有时,我们需要所有实例对象能够读写相同的内部数据。此时,只需将这些内部数据封装在类对象内部和new new()方法外部。复制的代码如下:var Cat={sound : '喵喵',Create New 3360 function(){ VARCAT={ };cat . MakeSound=function(){ alert(Cat . sound);};cat.changeSound=函数(x){ cat . sound=x;};还猫;}};

然后,生成两个实例对象:复制代码如下: var cat1=cat . new();var cat2=cat . new new();cat1 . MakeSound();//喵喵喵这个时候,如果有一个实例对象修改了共享数据,那么另一个实例对象也会受到影响。复制代码如下: cat 2 . change sound(' la la la ');cat1 . MakeSound();//啦啦啦啦

(结束)

版权声明:详细说明Javascript定义类的三种方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。