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 相关文章推荐
JavaScipt基本教程之JavaScript语言的基础
Jan 16 Javascript
Ext 今日学习总结
Sep 19 Javascript
读jQuery之九 一些瑕疵说明
Jun 21 Javascript
解决jquery版本冲突的有效方法
Sep 02 Javascript
JavaScript中的Repaint和Reflow用法详解
Jul 27 Javascript
使用jQuery调用XML实现无刷新即时聊天
Aug 07 Javascript
JavaScript实现的select点菜功能示例
Jan 16 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
Dec 07 Javascript
小程序登录态管理的方法示例
Nov 13 Javascript
JS使用Dijkstra算法求解最短路径
Jan 17 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
Aug 20 Javascript
JS如何寻找数组中心索引过程解析
Jun 01 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
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
javascript 模拟点击广告
2010/01/02 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
2017/03/08 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
python多线程编程中的join函数使用心得
2014/09/02 Python
在Python中调用ggplot的三种方法
2015/04/08 Python
python调用fortran模块
2016/04/08 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
python PyTorch预训练示例
2018/02/11 Python
python获取代理IP的实例分享
2018/05/07 Python
python 字符串和整数的转换方法
2018/06/25 Python
python3.7 的新特性详解
2019/07/25 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
Django 解决由save方法引发的错误
2020/05/21 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
联想阿根廷官方网站:Lenovo Argentina
2019/10/14 全球购物
深圳-东方伟业笔试部分
2015/02/11 面试题
和平主题的演讲稿
2014/01/12 职场文书
争先创优活动总结
2014/08/27 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书