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 相关文章推荐
使用jQuery的将桌面应用程序引入浏览器
Nov 19 Javascript
关于JAVASCRIPT urldecode URL解码的问题
Jan 08 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
May 04 Javascript
js图片实时加载提供网页打开速度
Sep 11 Javascript
jquery移动节点实例
Jan 14 Javascript
JS实现文字向下滚动完整实例
Feb 06 Javascript
jquery实现从数组移除指定的值
Jun 24 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
May 28 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
May 18 Javascript
electron中使用bootstrap的示例代码
Nov 06 Javascript
JS typeof fn === 'function' && fn()详解
Aug 22 Javascript
手写实现JS中的new
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
php.ini 配置文件的深入解析
2013/06/17 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
php与Mysql的一些简单的操作
2015/02/26 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
PHP观察者模式原理与简单实现方法示例
2017/08/25 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
JavaScript模拟重力状态下抛物运动的方法
2015/03/03 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
javascript的几种写法总结
2016/09/30 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
2017/04/14 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
如何在vue中使用HTML 5 拖放API
2021/01/14 Vue.js
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
Python hmac模块使用实例解析
2019/12/24 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
浅析CSS3 中的 transition,transform,translate之间区别和作用
2020/03/26 HTML / CSS
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
档案管理员岗位职责
2013/12/01 职场文书
同学会主持词
2014/03/18 职场文书
建筑工地门卫岗位职责
2014/04/30 职场文书
音乐节策划方案
2014/06/09 职场文书
中职生求职信
2014/07/01 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
南京导游词
2015/02/03 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
安全责任协议书范本
2016/03/23 职场文书
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers