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中SetTimeOut传参问题探讨
May 10 Javascript
Javascript 遍历页面text控件详解
Jan 06 Javascript
jquery图形密码实现方法
Mar 11 Javascript
简介JavaScript中的setDate()方法的使用
Jun 11 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
Aug 27 Javascript
pace.js页面加载进度条插件
Sep 29 Javascript
JavaScript实现窗口抖动效果
Oct 19 Javascript
详解vue 配合vue-resource调用接口获取数据
Jun 22 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
Jul 26 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
Sep 26 Javascript
实例解析ES6 Proxy使用场景介绍
Jan 08 Javascript
微信小程序左滑删除实现代码实例
Sep 16 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
《逃离塔科夫》——“萌新劝退,老手自嗨”的硬核FPS游戏
2020/04/03 其他游戏
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
vue debug 二种方法
2018/09/16 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
[47:55]Ti4第二日主赛事败者组 NaVi vs EG 1
2014/07/20 DOTA
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
tensorflow更改变量的值实例
2018/07/30 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
python TK库简单应用(实时显示子进程输出)
2019/10/29 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
struct与class的区别
2014/02/03 面试题
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
简历中的自我评价范文
2014/02/05 职场文书
学校安全生产承诺书
2014/05/23 职场文书
户外宣传策划方案
2014/05/25 职场文书
公司任命书模板
2014/06/06 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书