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.AutoComplete.js中文修正版(支持firefox)
Apr 09 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
Mar 10 Javascript
jQuery中使用了document和window哪些属性和方法小结
Sep 13 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
Jun 16 Javascript
JavaScript操作Cookie方法实例分析
May 27 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
Aug 13 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
Dec 08 Javascript
100行代码理解和分析vue2.0响应式架构
Mar 09 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
Sep 13 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
Jun 07 Javascript
js实现直播点击飘心效果
Aug 19 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
Nov 04 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 Smarty生成EXCEL文档的代码
2008/08/23 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
Yii CDBCriteria常用方法实例小结
2017/01/19 PHP
PHP解决中文乱码
2017/04/28 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
载入进度条 效果
2006/07/08 Javascript
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
2015/12/23 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
简单谈谈gulp-changed插件
2017/02/21 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
[00:15]TI9地铁玩家打卡
2019/08/11 DOTA
python3实现暴力穷举博客园密码
2016/06/19 Python
Python冒泡排序注意要点实例详解
2016/09/09 Python
python连接mysql实例分享
2016/10/09 Python
python数据结构之列表和元组的详解
2017/09/23 Python
python 读写文件,按行修改文件的方法
2018/07/12 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
外国人来华邀请函
2015/01/31 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
交通安全宣传标语(100条)
2019/08/22 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python