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判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
Oct 15 Javascript
JavaScript中的类继承
Nov 25 Javascript
jquery怎样实现ajax联动框(一)
Mar 08 Javascript
js创建元素(节点)示例
Jan 02 Javascript
jQuery截取指定长度字符串的实现原理及代码
Jul 01 Javascript
JavaScript及jquey实现多个数组的合并操作
Sep 06 Javascript
JavaScript中的普通函数与构造函数比较
Apr 07 Javascript
jQuery解析XML文件同时动态增加js文件的方法
Jun 01 Javascript
简介JavaScript中search()方法的使用
Jun 06 Javascript
js模仿php中strtotime()与date()函数实现方法
Aug 11 Javascript
详解关于vue2.0工程发布上线操作步骤
Sep 27 Javascript
VUE实现密码验证与提示功能
Oct 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中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
jQuery textarea的长度进行验证
2009/05/06 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
JS代码防止SQL注入的方法(超简单)
2016/04/12 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
JS实现求5的阶乘示例
2019/01/21 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
python实现括号匹配的思路详解
2018/08/23 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Corelle官方网站:购买康宁餐具
2016/11/02 全球购物
联想哥伦比亚网上商城:Lenovo Colombia
2017/01/10 全球购物
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
List, Set, Map是否继承自Collection接口?
2016/05/16 面试题
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
2014端午节活动策划方案
2014/01/27 职场文书
销售员求职个人的自我评价
2014/02/19 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
甜品蛋糕店创业计划书
2014/09/21 职场文书
出租车拒载检讨书
2015/01/28 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
Mysql排序的特性详情
2021/11/01 MySQL