虽然Javascript是一种脚本语言,但是依然可以定义和使用类。在这个小程序中,将监控点相关的功能做成了一个类。

alarm.js

//alarm.js:

const util = require('./util.js')

const CHECK_BUFFER_SIZE = 3

//构造函数

function Alarm(data){

this.latitude = data.latitude

this.longitude = data.longitude

this.state = data.state

this.checkBuffer = []

this.title = data.title

this.monitor_type = data.monitor_type

this.action_type = data.action_type

this.meaia_url = data.media_url

this.timer = data.timer

}

//定义原型

Alarm.prototype ={

constructor:Alarm,

setTitle: function (t) {

this.title = t

},

setMonitorType:function(m_type){

this.monitor_type = m_type

},

setActionType: function (a_type) {

this.action_type = a_type

},

setMedia: function (url) {

this.media_url = url

},

setTimer: function(t_name) {

this.timer = t_name

},

checkLocation: function (latitude, longitude, accuracy) {

const app = getApp()

var that = this;

var distance = util.getDistance(this.latitude, this.longitude, latitude, longitude)

app.addLog(distance + "," + accuracy)

if (distance < accuracy) {

this.checkBuffer.push(1)

} else {

this.checkBuffer.push(-1)

}

if (this.checkBuffer.length > CHECK_BUFFER_SIZE) {

this.checkBuffer.shift()

}

var sum = 0;

that.checkBuffer.forEach(function (value) {sum += value})

if (this.moitor_type == '接近监控点') {

if (this.state == 'new') {

if (sum == -CHECK_BUFFER_SIZE) {

this.state = 'armed'

}

} else if (this.state == 'armed') {

if (sum == CHECK_BUFFER_SIZE) {

this.state = 'fired'

}

}

} else {

if (this.state == 'new') {

if (sum == CHECK_BUFFER_SIZE) {

this.state = 'armed'

}

} else if (this.state == 'armed') {

if (sum == -CHECK_BUFFER_SIZE) {

this.state = 'fired'

}

}

}

},

excueteAction: function () {

play.playVoice(this.media_url)

},

};

module.exports = {

Alarm:Alarm,

}

代码说明

在alarm.js中,定义了一个名为Alarm的类。

首先定义了一个Alarm构造函数,它以一个对象data作为参数,函数的功能就是从data中取出数据并设定到相应的数据成员上。

接下来定义了一个prototype对象,它的内部又定义了若干函数。所有通过new Alarm获得的对象都以protype中定义的内容作为原型。换言之就是都可以使用prototype中定义的函数。

最后的module.export语句定义的本模块对外公开的功能。

函数的内容我们在后续文章中说明。

类的使用

导入类

首先需要在利用者模块中导入Alarm类。与Alarm.js中的module.export相对应,可以使用以下的方式:

import { Alarm } from './utils/alarm.js'

创建对象,使用对象

var alarm = new Alarm({latitude:38,longitude:120})

alarm.setActionType("播放提示音")

代码下载链接

alarm.js

https://raw.githubusercontent.com/xueweiguo/alarmmap/master/utils/alarm.js

写在文章的最后

既然已经读到这里了,拜托大家再用一分钟时间,将文章转发到各位的朋友圈,微信群中。本公众号的成长需要您的支持!
以上就是今天的文章,欢迎点赞并推荐给您的朋友!
更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

EAUML日拱一卒-微信小程序实战:位置闹铃 (13)-使用类优化程序结构相关推荐

  1. EAUML日拱一卒-微信小程序实战:位置闹铃 (5)-显示所在位置的信息

    假设我们指定了多个监控点,接下来的需求就是给每个监控点取名字.如果是手动输入的话,会比较麻烦.所以位置闹铃再向前走一步,从地图上取得监控点所在位置的信息作为监控点的名称. 画面说明 当我们选定监控点以 ...

  2. EAUML日拱一卒-微信小程序实战:位置闹铃 (18)-差不多就这样了

    经过一段时间地实现和测试,位置闹铃小程序开发也渐渐接近尾声了.作为一个练习,差不多也就这样了. 今天介绍小程序的功能. 启动小程序 扫描下面的二维码即可启动位置闹铃小程序. 功能介绍 首先是主画面,第 ...

  3. EAUML日拱一卒-微信小程序实战:位置闹铃 (17)-保存和取出设定信息

    设定了监控点之后,小程序会取得最新位置,判断各个监控点的到达,离开情况并播放提示音.很多情况下,用户会希望这些信息可以保存起来以便将来使用. 这就是今天的主题:在小程序中保存设定信息. API 位置闹 ...

  4. EAUML日拱一卒-微信小程序实战:位置闹铃 (16)-单元测试是个技术活

    程序设计,实现之后的下一个环节就是单元测试了.对于位置闹铃小程序来讲,带着设备到处移动以测试监控点的状态迁移就是一个必经之路,但是如果所有环节都通过实地测试来解决,那将耗费大量的时间和体力. 我们的选 ...

  5. EAUML日拱一卒-微信小程序实战:位置闹铃 (8)-WXML条件渲染

    需求 按照位置闹铃程序的设计,当设备接近或者离开某个区域时,可以播放提示音,也可触发记时器动作.按照设计,我们的画面是这样的. 提示音选择画面 计时器选择画面 实现方式 一般来讲,根据动作动作类型选择 ...

  6. EAUML日拱一卒-微信小程序实战:位置闹铃 (15)-实现监控点状态迁移功能

    简单地设计以后,就可以开始着手实现了. 接近监控点 enterAlarmCheck: function (distance, accuracy){ if (this.state == 'ready') ...

  7. EAUML日拱一卒-微信小程序实战:位置闹铃 (19)-发布微信小程序

    小程序的功能实现之后,经过一段时间地测试,接下来就是发布了. 在开发工具的上面偏右的位置,有一个[上传]按钮,按下它就可以将小程序上传到微信小程序公众号. 登录自己的小程序帐号,进入开发管理页面. 画 ...

  8. EAUML日拱一卒-微信小程序实战:位置闹铃 (6)-播放音频

    昨天停更了一天,不是作者偷懒,而是掉到了一个坑里.本来以为播放音频很简单,但是还是遇到的各种问题,比如: 1)小程序无法播放手机存储目录中的文件,只能播放网上的或者是小程序暂存的文件. 2)播放暂存文 ...

  9. EAUML日拱一卒-微信小程序实战:位置闹铃 (20)-发布微信小程序(续)

    头一天晚上申请,到第二天早上也没有通过,所以就有了这篇续. 审批通过以后,首先手机的服务通知收到这个: 登录小程序帐号,画面的右上角也会有提示. 这时的开发管理页面是这样的: 可以看到审核版本栏版本号 ...

最新文章

  1. testngpp - next generation unit test framework for c/c++
  2. 23个MySQL常用查询语句
  3. 1.4. Rosegarden
  4. python request-urllib.request
  5. python 获取子目录下的所有文件的路径
  6. 扑克牌比大小c语言,算了算学了有一个月c语言了,写了个扑克牌程序
  7. lucene和elasticsearch的前世今生、elasticsearch的核心概念、elasticsearch核心概念 vs. 数据库核心概念(来自学习资料)
  8. python apscheduler执行_python apscheduler 每两小时执行一次
  9. *【HDU - 2473】Junk-Mail Filter (并查集--删点操作)
  10. LeetCode 1671. 得到山形数组的最少删除次数(最长上升子序DP nlogn)
  11. 明年Wi-Fi手机销量5亿 无线技术助移动互联网爆发
  12. (附源码)spring boot企业合同管理系统 毕业设计 161456
  13. php公网不能访问8080,linux启动tomcat外部浏览器不能访问8080端口解决方案
  14. android 实现层叠列表,RecyclerView进阶之层叠列表(下)
  15. C语言_printf
  16. 使用html 语言建立一个简单的网页,如何用记事本建立简单的网页(1).doc
  17. 硬盘无法访问设备未就绪,里面的数据怎么找回
  18. [转]PCB Layout中的走线策略
  19. jdbc PreparedStatement中“?”报错
  20. python图片文本识别的简单实现

热门文章

  1. 软件开发Share the Cakes
  2. 修改文件后缀 java_java批量修改文件后缀名方法总结|chu
  3. ArcGIS基础:基于python代码简单计算坡度、坡向和洪水淹没
  4. 2019年测试行业展望
  5. 又是一年将尽时 移动开始话费大促销
  6. 汇哲培训——IT审计师轻叩中国大门--小球撬动大球
  7. 添加Typora主题皮肤
  8. 虚拟主机环境WinWebMail邮件系统的常见问题处理
  9. 健康闹钟+颈椎操,保护你的颈椎
  10. 电荷放大器 压电效应 压电式传感器测量振动实验