博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript原型
阅读量:4046 次
发布时间:2019-05-25

本文共 1527 字,大约阅读时间需要 5 分钟。

一、引入:为多个对象统一添加属性

首先看下面一段程序

       function Person(perName,perAge){

              this.perName = perName;

              this.perAge = perAge;

              this.toString = function(){

                     return "PersonName="+this.perName+" PersonAge="+this.perAge;

              };

       }

      

       var per01 = new Person("Tom", 20);

       var per02 = new Person("Jerry", 25);

      

       console.log(per01.toString());

       console.log(per02.toString());

 

执行结果:

PersonName=Tom PersonAge=20

PersonName=Jerry PersonAge=25

 

在这段程序中声明了一个构造器函数Person,使用这个构造器函数创建了两个对象,并在控制台中进行了显示。

现在如果我们需要给每个Person对象都添加一个gender属性,最直接的做法可能是这样:

       function Person(perName,perAge,gender){

              this.perName = perName;

              this.perAge = perAge;

              this.gender = gender;

              this.toString = function(){

                     return "PersonName="+this.perName+" PersonAge="+this.perAge+" PersonGender="+this.gender;

              };

       }

      

       var per01 = new Person("Bob", 20, "male");

       var per02 = new Person("Kate", 25, "female");

      

       console.log(per01.toString());

       console.log(per02.toString());

 

执行结果:

PersonName=Bob PersonAge=20 PersonGender=male

PersonName=Kate PersonAge=25 PersonGender=female

 

可是这样做有一个问题:如果Person这个构造器函数不是我们创建的,我们也不能修改它,还能否添加属性呢?

当然可以,使用JavaScript的原型机制就可以做到。

 

二、原型

1.函数原型

在JavaScript中,函数不仅仅是一个可以重用的代码块,而且还可以作为一种数据使用。在堆空间中为函数分配了它的存储空间,函数名或函数的其他形式的引用保存了这个存储空间的引用地址。所以JavaScript中的函数是一种引用数据类型,这就是为什么我们说JavaScript中的函数也是对象。

那么函数这样的对象有很多特殊的性质,原型就是其中之一。每一个函数对象都包含一个属性:prototype。当我们声明一个函数时,函数对象就创建好了。而函数对象创建的同时,系统还会同时创建一个对象,并让函数对象的prototype属性指向它。

比如说,当我们执行下面代码时:

       function Person(perName,perAge){

              //…

       }

 

就声明了一个函数,系统会将这个函数对象创建出来。内存中应该是这样的情况:

但是更深层次挖掘一下,我还需要知道创建函数对象的同时,还会创建一个“原型对象”,由函数对象的prototype属性指向这个原型对象。

 

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

 

你可能感兴趣的文章
医疗行业运用企业云盘可以带来什么样的提升
查看>>
教育数字智能化能为现有体系带来新的起点
查看>>
媒体广告业如何将内容资产进行高效地综合管理与利用
查看>>
能源化工要怎么管控核心数据
查看>>
媒体广告业如何运用云盘提升效率
查看>>
企业如何运用企业云盘进行数字化转型-实现新发展
查看>>
司法如何运用电子智能化加快现代化建设
查看>>
iSecret 1.1 正在审核中
查看>>
IOS开发的开源库
查看>>
IOS开发的开源库
查看>>
Jenkins - sonarqube 代码审查
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成(一)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
Golang struct 指针引用用法(声明入门篇)
查看>>
Linux 粘滞位 suid sgid
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>
C# 托管与非托管
查看>>