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 可拖拽的窗体控件实现代码
Mar 21 Javascript
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
Jan 06 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
Jun 21 Javascript
Seajs的学习笔记
Mar 04 Javascript
js改变Iframe中Src的方法
May 05 Javascript
js判断出两个字符串最大子串的函数实现方法
Nov 01 Javascript
微信小程序开发一键登录 获取session_key和openid实例
Nov 23 Javascript
详解Vue监听数据变化原理
Mar 08 Javascript
bootstrap daterangepicker汉化以及扩展功能
Jun 15 Javascript
javascript trie前缀树的示例
Jan 29 Javascript
TypeScript开发Node.js程序的方法
Apr 30 Javascript
Layui 动态禁止select下拉的例子
Sep 03 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操作xml入门之xml标签的属性分析
2015/01/23 PHP
PHP面试题之文件目录操作
2015/10/15 PHP
PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 如何解决
2016/04/17 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
JS array 数组详解
2009/03/22 Javascript
用js实现小球的自由移动代码
2013/04/22 Javascript
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
JS前端笔试题分析
2016/12/19 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
Quasar Input:type="number" 去掉上下小箭头 实现加减按钮样式功能
2020/04/09 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
Django中的文件的上传的几种方式
2018/07/23 Python
Python判断telnet通不通的实例
2019/01/26 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
python flask框架实现重定向功能示例
2019/07/02 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
如何编写python的daemon程序
2021/01/07 Python
html5.2 dialog简介详解
2018/02/27 HTML / CSS
个人廉洁自律承诺书
2014/03/27 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
求职自荐信怎么写
2015/03/04 职场文书
如何书写邀请函?
2019/06/24 职场文书