JS利用prototype给类添加方法操作详解


Posted in Javascript onJune 21, 2019

本文实例讲述了JS利用prototype给类添加方法操作。分享给大家供大家参考,具体如下:

1.如何定义一个简单的类?

以下是一个没有任何属性和方法的类的定义:

function MyClass(){};

你可能会想,这不就是个简单的函数声明?没错,这个函数就是一个类的定义的实现。如何使用这个类呢?看下面的代码:

var cls1 = new MyClass();

这样,利用new就可以生成MyClass的一个实例了。所以在js中可以说函数就是类,类就是函数。

2.给类增加属性和方法

function MyClass(name,age){
  this.name = name;
  this.age = age;
}
var cls1 = new MyClass("lily",18);
alert(cls1.name);

从上面的代码可以看出,在函数内使用this就能给函数本身增加属性值。而在上面的代码中就给myClass函数增加了name和age属性。

同样,还可以利用this给这个类增加一个 toString 方法,代码如下:

function MyClass(name,age){
  this.name = name;
  this.age = age;
  this.toString() = function(){
    alert(this.name +":"+ this.age);
  };
}
var cls1 = new MyClass("liming",10);
cls1.toString();

我们已经成功的给MyClass增加了toString方法。另外也可以用以下代码来添加方法:

function MyClass(name,age){
  this.name = name;
  this.age = age;
}
var cls1 = new MyClass("liming",10);
cls1.toString() = function(){
            alert(this.name +":"+ this.age);
          };
cls1.toString(); // [liming:10]
var cls2 = new MyClass("zhang",10);
cls2.toString(); //报错

虽然这样也能给这个类添加一个方法,但这种方式只是给cls1这个实例增加了方法,并未给MyClass本身增加方法。

cls2并不存在toString方法。

3.引出prototype

从上面我们已经知道要给MyClss类的本身增加方法,需要讲方法定义在MyClass这个函数内部,这样的话,每声明一个新的实例,就会将MyClass本身复制一遍,这显然不是最优的做法。

既然不能将一个类(函数)所包含的方法都定义在函数的内部,那么,如何来给一个类添加方法呢?这就需要用到函数的prototype属性了。

每一个函数都会包含一个prototype属性,这个属性指向了一个prototype对象,我们可以指定函数对应的prototype对象。如果不指定,则函数的prototype属性将指向一个默认的prototype对象,并且次默认的prototype对象的constructor属性又会指向该函数。

当用构造函数创建一个新的对象时,新的对象会获取构造函数的prototype属性所指向的prototype对象的所有属性和方法,这样一来,构造函数对应的prototype对象所做的任何操作都会反映到它所生成的对象上,所有的这些对象将共享与构造函数对应的prototype对象的属性和方法。

虽然新创建的对象可以使用它的构造函数所指向的prototype对象的属性和方法,但不能像构造函数那样直接调用prototype对象(对象没有prototype属性)。

简而言之,就是如果我们使用函数的prototype对象来给函数添加方法,那么在创建一个新的对象的时候,并不会复制这个函数的所有方法,而是指向了这函数的所有方法。

具体看下面的代码:

function MyClass(name,age){
  this.name = name;
  this.age = age;
}
MyClass.prototype.toString = function(){
  //
}
var cls1 = new MyClass("liming",10);
cls1.toString(); //
var cls2 = new MyClass("zhang",10);
cls2.toString();

如果要加入多个方法,也可以使用下面的方式:

function MyClass(name,age){
  this.name = name;
  this.age = age;
}
MyClass.prototype = {
  toString:function(){
    //
  },
  sayHellow:function(){
    //
  }
};

这就是js中给类添加方法的实现,它是利用prototype来实现封装的。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
基于JQuery的6个Tab选项卡插件
Sep 03 Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
Jul 13 Javascript
JavaScript中日期的相关操作方法总结
Oct 24 Javascript
IScroll5 中文API参数说明和调用方法
May 21 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
Dec 25 Javascript
利用vueJs实现图片轮播实例代码
Jun 03 Javascript
Bootstrap Table 搜索框和查询功能
Nov 30 Javascript
js动态引入的四种方法
May 05 Javascript
详解JavaScript中关于this指向的4种情况
Apr 18 Javascript
微信小程序 生成携带参数的二维码
Oct 23 Javascript
利用React高阶组件实现一个面包屑导航的示例
Aug 23 Javascript
详解vite2.0配置学习(typescript版本)
Feb 25 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
Jun 21 #Javascript
微信小程序实现弹出菜单动画
Jun 21 #Javascript
js类的继承定义与用法分析
Jun 21 #Javascript
js中值引用和地址引用实例分析
Jun 21 #Javascript
微信小程序实现消息框弹出动画
Apr 18 #Javascript
前端Electron新手入门教程详解
Jun 21 #Javascript
javascript实现自由编辑图片代码详解
Jun 21 #Javascript
You might like
打造计数器DIY三步曲(中)
2006/10/09 PHP
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
php多文件上传下载示例分享
2014/02/20 PHP
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
Vue.js组件tab实现选项卡切换
2020/03/23 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
通过一个简单的例子学会vuex与模块化
2017/11/22 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
vue权限管理系统的实现代码
2019/01/17 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
Python脚本实现网卡流量监控
2015/02/14 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
2019/03/26 Python
python基于event实现线程间通信控制
2020/01/13 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
三星英国官网:Samsung英国
2018/09/25 全球购物
中学生爱国演讲稿
2013/12/31 职场文书
单位未婚证明范本
2014/01/18 职场文书
综合实践教学反思
2014/01/31 职场文书
公司员工离职证明书
2014/10/04 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
Python机器学习之基于Pytorch实现猫狗分类
2021/06/08 Python