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 相关文章推荐
通过javascript设置css属性的代码
Dec 28 Javascript
js 浏览器事件介绍
Mar 30 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
Nov 18 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
Jan 06 Javascript
jQuery动画效果图片轮播特效
Jan 12 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
Aug 31 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
Nov 13 Javascript
node.js的http.createServer过程深入解析
Jun 06 Javascript
Node 代理访问的实现
Sep 19 Javascript
js实现课堂随机点名系统
Nov 21 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
Feb 07 Javascript
es6函数name属性功能与用法实例分析
Apr 18 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
Safari5中alert的无限循环BUG
2011/04/07 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
详解babel升级到7.X采坑总结
2019/05/12 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
原生js实现购物车
2020/09/23 Javascript
js实现抽奖功能
2020/11/24 Javascript
jQuery实现增删改查
2020/12/22 jQuery
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
[00:32]2018DOTA2亚洲邀请赛出场——VP
2018/04/04 DOTA
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
Python列表切片用法示例
2017/04/19 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
python opencv检测目标颜色的实例讲解
2018/04/02 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
Django数据库操作之save与update的使用
2020/04/01 Python
Python如何给你的程序做性能测试
2020/07/29 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
大学毕业生简单自荐信
2013/11/05 职场文书
吸烟检讨书2000字
2014/02/13 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
政工师工作总结2015
2015/05/26 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
Python数据处理的三个实用技巧分享
2022/04/01 Python
PHP正则表达式之RCEService回溯
2022/04/11 PHP