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 相关文章推荐
上传图片预览JS脚本 Input file图片预览的实现示例
Oct 23 Javascript
JavaScript设计模式经典之命令模式
Feb 24 Javascript
js两种拼接字符串的简单方法(必看)
Sep 02 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
May 10 Javascript
javascript 通过键名获取键盘的keyCode方法
Dec 31 Javascript
Vue数据双向绑定原理及简单实现方法
May 18 Javascript
vue自定义指令用法经典实例小结
Mar 16 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
May 16 Javascript
JavaScript 继承 封装 多态实现及原理详解
Jul 29 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
Sep 20 Javascript
jQuery 移除事件的方法
Jun 20 jQuery
Web应用开发TypeScript使用详解
May 25 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随机数生成代码与使用实例分析
2011/04/08 PHP
php生成图片验证码
2015/06/09 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
javascript关于继承的用法汇总
2014/12/20 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
JS实现两周内自动登录功能
2017/03/23 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
jquery实现掷骰子小游戏
2019/10/24 jQuery
微信小程序如何获取地址
2019/12/24 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
[05:48]DOTA2英雄梦之声vol21 屠夫
2014/06/20 DOTA
python妹子图简单爬虫实例
2015/07/07 Python
详解Python中的from..import绝对导入语句
2016/06/21 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
python中dict()的高级用法实现
2019/11/13 Python
Python综合应用名片管理系统案例详解
2020/01/03 Python
如何通过python实现全排列
2020/02/11 Python
python能做哪方面的工作
2020/06/15 Python
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
投标诚信承诺书
2014/05/26 职场文书
单位委托书怎么写
2014/08/02 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
企业法人代表证明书
2014/09/27 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
求职自荐信范文(优秀篇)
2015/03/27 职场文书
公司借款担保书
2015/09/22 职场文书
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB