JavaScript中利用构造器函数模拟类的方法


Posted in Javascript onFebruary 16, 2017

前言

本文小编带大家一起学习的是在 JavaScript 中使用构造器函数(construcor function)模拟类。下面话不多说,感兴趣的朋友们下面来一起看看吧。

构造器函数简介

你可以使用 ES6 的 class 关键字来实现类,不过我建议你使用传统的构造器函数来模拟类,因为这样可以给人一种你是个 JavaScript 老手的错觉,哈哈!

什么是构造器函数?构造器函数是编写对象的方法之一。一般情况下,你可以这样编写一个对象:

var obj = { a:1, b:2 };

但也可以使用构造器函数来编写对象:

function Obj(a, b){
 this.a = a;
 this.b = b;
}
var obj = new Obj(1, 2); //obj 等价于 { a:1, b:2 }

使用构造器函数的好处在于可以传递参数。构造器函数通常首字母大写,而且需要使用 new 关键词来调用。在 JavaScript 中是没有类的,利用构造器函数我们可以模拟一个类。

使用构造器函数编写栈类

了解了构造器函数,我们使用它编写一个迷你的栈类,下面就是实现代码:

Stack.js

function Stack() {
 // 私有变量 items,用于记录数组,对象不能直接操作
 var items = [];
 // 类方法 push,在数组末尾添加项,对象可以直接调用
 this.push = function (element) {
 items.push(element);
 };
 // 删除并返回数组末尾的项
 this.pop = function () {
 return items.pop();
 };
}

上述栈类中,有个私有变量 items ,为何它就不能直接操作呢?为何挂在 this 上的方法可以直接调用?因为 new 操作符会将构造器函数中的 this 指向生成的对象,也就是说挂在 this 上的方法或属性将来会成为生成对象的方法或属性,所以可以直接调用。而 items 则是函数内部的一个局部变量,它在函数外部是不可见的,生成对象只能通过调用自身的方法,沿着作用域链来操作 items。

var stack = new Stack();
// stack 对象不能直接操作items,结果是 undefined
console.log(stack.items) 
 
// stack 对象可以直接操作构造器函数中挂在 this 上的属性和方法
stack.push(1);
// 打印了1
console.log(stack.pop())

如果你不熟悉 JavaScript ,那么你应该先学习一下 JavaScript 作用域、this 和 new 操作符的相关知识。推荐阅读参考 Stoyan Stefanow 的《JavaScript 面向对象编程指南》,这本书里面有很多小的代码片段以及相关的图文解读,可以帮助你更好地理解 JavaScript 的相关特性。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用Javascript能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
用tip解决Ext列宽度不够的问题
Dec 13 Javascript
JQuery下的Live方法和$.browser方法使用代码
Jun 02 Javascript
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
Nov 30 Javascript
javascript eval(func())使用示例
Dec 05 Javascript
jQuery中replaceWith()方法用法实例
Dec 25 Javascript
jqgrid实现简单的单行编辑功能
Sep 30 Javascript
bootstrap可编辑下拉框jquery.editable-select
Oct 12 jQuery
vue同步父子组件和异步父子组件的生命周期顺序问题
Oct 07 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
Apr 22 Javascript
es6数组includes()用法实例分析
Apr 18 Javascript
Openlayers显示瓦片网格信息的方法
Sep 28 Javascript
解决vue watch数据的方法被调用了两次的问题
Nov 07 Javascript
js实现截图保存图片功能的代码示例
Feb 16 #Javascript
javaScript+turn.js实现图书翻页效果实例代码
Feb 16 #Javascript
原生JS实现图片翻书效果
Feb 16 #Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
Feb 16 #Javascript
js+html制作简单验证码
Feb 16 #Javascript
Vue 仿百度搜索功能实现代码
Feb 16 #Javascript
javascript实现秒表计时器的制作方法
Feb 16 #Javascript
You might like
德劲1103二次变频版的打磨
2021/03/02 无线电
PHP批量生成缩略图的代码
2008/07/19 PHP
解析PHP提交后跳转
2013/06/23 PHP
Zend Framework教程之Application和Bootstrap用法详解
2016/03/10 PHP
Smarty变量用法详解
2016/05/11 PHP
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
JsRender实用入门教程
2014/10/31 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
jQuery日期范围选择器附源码下载
2017/05/23 jQuery
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
微信小程序实现登录遮罩效果
2018/11/01 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
python 多线程实现检测服务器在线情况
2015/11/25 Python
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
2018/04/27 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
医学检验专业个人求职信范文
2013/12/04 职场文书
学生打架检讨书大全
2014/01/23 职场文书
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python