在js中仿java的枚举类型设计实例
2017-11-09 21:14
447 查看
简介
在javascript中,像EventTarget.addEventListener(),Document.createElement() 等方法,只接收指定字符串作为参数。比如:const okButton = document.getElementById("button_ok"); okButton.addEventListener('click', () => console.log('button_ok clicked!'), false);
在上述代码中,我们必须按Events 中所定义的类型字符串(如:click, load)传参,否则程序就不能正常工作。本文将介绍如何通过
object,
class两种封装形式,分别实现枚举类型。
object封装
index.html<!DOCTYPE> <html> <head> <meta charset="UTF-8"> <title>enum</title> </head> <body> <button id="button_cancel">Cancel</button> <button id="button_ok">OK</button> <script src="object_script.js"></script> </body> </html>
object_script.js
(function () { 'use strict'; /** 事件 */ const Event = { CLICK: "click", LOAD: "load" }; deepFreeze(Event); /** 响应 */ const Response = { OK: { code: 100, message: "ok" }, ERROR: { code: 900, message: "error" } }; deepFreeze(Response); addEventListener(window, Event.LOAD, () => { const okButton = document.getElementById("button_ok"); addEventListener(okButton, Event.CLICK, () => alert(generateResponseText(Response.OK))); const cancelButton = document.getElementById("button_cancel"); addEventListener(cancelButton, Event.CLICK, () => alert(generateResponseText(Response.ERROR))); }); /** * object深度冻结 * @param {Object} object 对象 */ function deepFreeze(object) { Object.freeze(object); for (const key in object) { const value = object[key]; if (!object.hasOwnProperty(key) || typeof value != "object" || Object.isFrozen(value)) { continue; } deepFreeze(value); } } /** * 事件监听器登记 * @param {EventTarget} target 目标 * @param {String} event 事件 * @param {Function} listener 监听器 * @throws {Error} 错误 */ function addEventListener(target, event, listener) { if (event === undefined) { throw new Error("event is undefined"); } target.addEventListener(event, listener, false); } /** * 响应字符串生成 * @param {Object} response 响应 * @return {String} 响应字符串 * @throws {Error} 错误 */ function generateResponseText(response) { if (response === undefined) { throw new Error("response is undefined"); } return "[" + response.code + "] " + response.message; } })();
class封装
index_class.html<!DOCTYPE> <html> <head> <meta char b37b set="UTF-8"> <title>enum</title> </head> <body> <button id="button_cancel">Cancel</button> <button id="button_ok">OK</button> <script src="class_script.js"></script> </body> </html>
class_script.js
(function () { 'use strict'; /** 值存储类 */ class HasValue { /** * @param {Object} value 值 */ constructor(value) { this.value = value; } } /** 事件类 */ class Event extends HasValue { } /** 事件常量 */ const Events = { CLICK: new Event("click"), LOAD: new Event("load") }; deepFreeze(Events); /** 响应类 */ class Response { /** * @param {Number} code 编码 * @param {String} message 消息 */ constructor(code, message) { this.code = code; this.message = message; } } /** 响应常量 */ const Responses = { OK: new Response(100, "ok"), ERROR: new Response(900, "error") }; deepFreeze(Responses); addEventListener(window, Events.LOAD, () => { const okButton = document.getElementById("button_ok"); addEventListener(okButton, Events.CLICK, () => alert(generateResponseText(Responses.OK))); const cancelButton = document.getElementById("button_cancel"); addEventListener(cancelButton, Events.CLICK, () => alert(generateResponseText(Responses.ERROR))); }); /** * object深度冻结 * @param {Object} object 对象 */ function deepFreeze(object) { Object.freeze(object); for (const key in object) { const value = object[key]; if (!object.hasOwnProperty(key) || typeof value != "object" || Object.isFrozen(value)) { continue; } deepFreeze(value); } } /** * 事件监听器登记 * @param {EventTarget} target 目标 * @param {Event} event 事件实例 * @param {Function} listener 监听器 * @throws {Error} 错误 */ function addEventListener(target, event, listener) { if (!(event instanceof Event)) { throw new Error("event is not instance of Event"); } target.addEventListener(event.value, listener, false); } /** * 响应字符串生成 * @param {Object} response 响应 * @return {String} 响应字符串 * @throws {Error} 错误 */ function generateResponseText(response) { if (!(response instanceof Response)) { throw new Error("response is not instance of Response"); } return "[" + response.code + "] " + response.message; } })();
查看原文:https://www.huuinn.com/archives/424
更多技术干货:风匀坊
关注公众号:风匀坊
相关文章推荐
- JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
- JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
- Effective Java之对于实例控制,枚举类型优于readResolve(七十七)
- 黑马程序员--张孝祥Java高新技术-JDK1.5新特性(二)【基本数据类型的自动拆箱与装箱,枚举】以及享元设计模式
- Java 5 - 枚举类型入门
- java设计模式的3种类型
- Java中的枚举类型
- JAVA动态模块的设计实现以及如何通过newInstance()来创建带参的构造类实例
- 简述java枚举类型
- 网页设计中JS与Java的区别
- JAVA简单实例-数据库设计思路引导(3)
- [设计模式] - 深入浅出单实例Singleton设计模式(Java版)
- 总算知道java的列表为何要设一个专用的枚举类型Iterator了
- js中的值类型和引用类型小结 文字说明与实例
- Java面向对象设计最佳实践 - 枚举设计
- java语言讲解singleton的编程思想---深入浅出单实例Singleton设计模式
- java类型安全枚举与反射机制相结合的应用 作者:封宇
- 越深入java 就觉得java做得越烂,java设计问题 之 :关于1.5,1.6 java处理基本对象类型cache的问题
- js数据类型转换 (附一个截取浮点数并四舍五入的实例)
- JAVA简单实例-数据库设计思路引导(4)