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截取函数(indexOf,join等)
Sep 01 Javascript
jquery 学习之二 属性 文本与值(text,val)
Nov 25 Javascript
JS中window.open全屏命令解析及使用示例
Dec 11 Javascript
推荐10个2014年最佳的jQuery视频插件
Nov 12 Javascript
JS通过ajax动态读取xml文件内容的方法
Mar 24 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
Aug 01 Javascript
6种javascript显示当前系统时间代码
Dec 01 Javascript
轻松实现js弹框显示选项
Sep 13 Javascript
深入理解ES6 Promise 扩展always方法
Sep 26 Javascript
vue组件编写之todolist组件实例详解
Jan 22 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
Mar 06 Javascript
javascript面向对象三大特征之继承实例详解
Jul 24 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定义函数代码
2015/02/26 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
php array_pop 删除数组最后一个元素实例
2016/11/02 PHP
php实用代码片段整理
2016/11/12 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
javascript eval函数深入认识
2009/02/21 Javascript
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
2018/09/19 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
2019/10/23 jQuery
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
python局部赋值的规则
2013/03/07 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
Python常见工厂函数用法示例
2018/03/21 Python
python使用Matplotlib改变坐标轴的默认位置
2019/10/18 Python
python中删除某个元素的方法解析
2019/11/05 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
python实现门限回归方式
2020/02/29 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
利用python进行文件操作
2020/12/04 Python
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
历史学专业个人的自我评价
2013/10/13 职场文书
护理专科学生自荐书
2014/07/05 职场文书
单位工作证明
2014/10/07 职场文书
实习介绍信模板
2015/01/30 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
感恩的心主题班会
2015/08/12 职场文书
基督教追悼会答谢词
2015/09/29 职场文书
求职信:会计求职的写作技巧
2019/04/24 职场文书