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实现倒计时按钮具体方法
Nov 14 Javascript
Node.js 的异步 IO 性能探讨
Oct 08 Javascript
JavaScript动态创建link标签到head里的方法
Dec 22 Javascript
jquery中show()、hide()和toggle()用法实例
Jan 15 Javascript
jQuery中slidedown与slideup方法用法示例
Sep 16 Javascript
浅谈vue中数据双向绑定的实现原理
Sep 14 Javascript
JS实现的计数排序与基数排序算法示例
Dec 04 Javascript
使用express+multer实现node中的图片上传功能
Feb 02 Javascript
Vue引入sass并配置全局变量的方法
Jun 27 Javascript
详解在HTTPS 项目中使用百度地图 API
Apr 26 Javascript
layui的数据表格+springmvc实现搜索功能的例子
Sep 28 Javascript
纯js+css实现在线时钟
Aug 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
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
PHP实现基于文本的摩斯电码生成器
2016/01/11 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
关于JavaScript中的this指向问题总结篇
2017/07/23 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
swiper4实现移动端导航栏tab滑动切换
2020/10/16 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
python的几种开发工具介绍
2007/03/07 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
Python中的枚举类型示例介绍
2019/01/09 Python
python按照多个条件排序的方法
2019/02/08 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
python使用递归的方式建立二叉树
2019/07/03 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
医生实习工作总结的自我评价
2013/09/27 职场文书
电信专业毕业生推荐信
2013/11/18 职场文书
酒会开场白大全
2015/06/01 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
Python中super().__init__()测试以及理解
2021/12/06 Python