js备忘

本文介绍了一种使用JavaScript中的正则表达式来匹配特定文献类型的方法。通过使用`match`函数获取符合要求的字符串数组,并利用`substring`方法提取所需数值。此技术在处理文本数据时非常实用。
 var str = res.match(/文献类型 类似 "\d+"/g);//match是字符串的方法,返回的是数组

 var num = str[0].substring(9, 13);//字符串的substring是左闭右开区间,取到索引9~12的值
<think>我们被要求详细解释JavaScript中的备忘录模式,并提供实现示例。 根据引用内容,备忘录模式是一种行为型设计模式,用于捕获对象的内部状态并在以后恢复,而不破坏封装性。 它常用于实现撤销操作、缓存、历史记录等功能。 关键点: 1. 备忘录模式允许在不暴露对象内部细节的情况下保存和恢复状态。 2. 主要角色: - 发起人(Originator):需要保存状态的对象。 - 备忘录(Memento):存储发起人内部状态的对象。 - 管理者(Caretaker):负责保存和恢复备忘录的对象,但不能对备忘录的内容进行操作或检查。 在JavaScript中,我们可以通过以下方式实现: 示例1:一个简单的文本编辑器撤销操作 我们将创建一个文本编辑器(发起人),它可以保存状态到备忘录(Memento),并且有一个管理者(Caretaker)来管理这些备忘录。 步骤: a. 定义备忘录类(Memento),用于存储文本编辑器的状态(文本内容)。 b. 定义发起人类(Originator),它可以创建备忘录并设置状态(设置和获取文本),以及从备忘录恢复状态。 c. 定义管理者类(Caretaker),它保存备忘录的栈(用于实现撤销和重做)。 示例2:引用[4]和[5]中提到的新闻缓存器,用于缓存已经请求过的数据,减少对服务器的请求。 我们将分别实现这两个示例。 示例1:文本编辑器撤销操作 ```javascript // 备忘录类 class Memento { constructor(state) { this.state = state; } getState() { return this.state; } } // 发起人类(文本编辑器) class Editor { constructor() { this.content = ''; } // 设置内容 setContent(content) { this.content = content; } // 获取内容 getContent() { return this.content; } // 保存状态到备忘录 save() { return new Memento(this.content); } // 从备忘录恢复状态 restore(memento) { this.content = memento.getState(); } } // 管理者类 class Caretaker { constructor() { this.mementos = []; // 用于存储备忘录历史 this.currentIndex = -1; // 当前状态的索引 } // 保存状态 saveState(editor) { const memento = editor.save(); // 如果当前索引不在最后,则移除当前索引之后的所有状态(因为进行了新的操作) if (this.currentIndex < this.mementos.length - 1) { this.mementos = this.mementos.slice(0, this.currentIndex + 1); } this.mementos.push(memento); this.currentIndex = this.mementos.length - 1; } // 撤销 undo(editor) { if (this.currentIndex <= 0) { return; // 无法撤销 } this.currentIndex--; editor.restore(this.mementos[this.currentIndex]); } // 重做 redo(editor) { if (this.currentIndex >= this.mementos.length - 1) { return; // 无法重做 } this.currentIndex++; editor.restore(this.mementos[this.currentIndex]); } } // 使用示例 const editor = new Editor(); const caretaker = new Caretaker(); // 第一次输入 editor.setContent('First text'); caretaker.saveState(editor); // 保存状态0 console.log(editor.getContent()); // 'First text' // 第二次输入 editor.setContent('Second text'); caretaker.saveState(editor); // 保存状态1 console.log(editor.getContent()); // 'Second text' // 第三次输入 editor.setContent('Third text'); caretaker.saveState(editor); // 保存状态2 console.log(editor.getContent()); // 'Third text' // 撤销 caretaker.undo(editor); console.log(editor.getContent()); // 'Second text' // 再撤销 caretaker.undo(editor); console.log(editor.getContent()); // 'First text' // 重做 caretaker.redo(editor); console.log(editor.getContent()); // 'Second text' ``` 示例2:新闻缓存器(使用闭包实现) 引用[4]和[5]中的例子,我们创建一个新闻缓存器,用于缓存已经请求过的页面数据。 ```javascript var Page = (function() { // 缓存对象,以页码为键存储数据 var cache = {}; // 返回一个函数,用于获取指定页的数据 return function(page, successCallback) { // 如果缓存中有该页数据,则直接使用 if (cache[page]) { // 显示页面 showPage(page, cache[page]); // 如果有成功回调,则执行 successCallback && successCallback(); } else { // 否则,从服务器获取 // 这里使用jQuery的post方法,实际中可以使用任何AJAX方法 $.post('server_api_url', { page: page }, function(response) { if (response.success) { // 显示页面 showPage(page, response.data); // 缓存数据 cache[page] = response.data; // 执行回调 successCallback && successCallback(); } else { console.error('Error fetching page ' + page); } }); } }; // 显示页面的函数(模拟) function showPage(page, data) { console.log('Showing page ' + page + ' with data: ', data); // 实际中这里会更新DOM } })(); // 使用示例 // 假设有一个下一页按钮 $('#next_page').click(function() { // 假设当前页存储在某个元素上,例如#news_content的data-page属性 var currentPage = $('#news_content').data('page'); var nextPage = currentPage + 1; // 获取并显示新闻 Page(nextPage, function() { // 更新当前页 $('#news_content').data('page', nextPage); }); }); ``` 注意:在第二个示例中,我们使用了闭包来保护缓存对象`cache`,避免被外部直接修改,这符合备忘录模式保护状态封装性的要求。 总结: 备忘录模式在JavaScript中可以通过类的方式(如示例1)或者闭包的方式(如示例2)实现。 它主要用于状态保存和恢复,适用于需要撤销/重做、缓存、历史记录等场景。 注意事项: 1. 备忘录可能会消耗大量内存,因为保存了对象状态的多个副本。 2. 在需要保存大对象或频繁保存状态时,需考虑性能问题。 相关问题: 1. 备忘录模式与状态模式有何区别? 2. 如何优化备忘录模式的内存使用? 3. 除了撤销操作和缓存,备忘录模式还有哪些应用场景?</think>### JavaScript 备忘录模式详解 备忘录模式是一种**行为型设计模式**,用于在不破坏对象封装性的前提下,捕获并存储对象的内部状态,以便后续恢复。该模式的核心是将状态保存逻辑与业务逻辑解耦,常用于实现撤销操作、缓存、历史记录等功能[^1][^2]。 #### 核心组件 1. **发起人(Originator)** 需要保存状态的对象(如编辑器、数据管理器)。 2. **备忘录(Memento)** 存储发起人内部状态的对象(如快照)。 3. **管理者(Caretaker)** 负责保存和恢复备忘录(如历史记录管理器)。 #### 实现示例 ##### 示例1:文本编辑器撤销操作 ```javascript // 备忘录:存储编辑器状态 class EditorMemento { constructor(content) { this.content = content; } } // 发起人:文本编辑器 class TextEditor { constructor() { this.content = ""; } // 输入内容 type(text) { this.content += text; } // 保存状态到备忘录 save() { return new EditorMemento(this.content); } // 从备忘录恢复状态 restore(memento) { this.content = memento.content; } getContent() { return this.content; } } // 管理者:历史记录管理 class HistoryManager { constructor() { this.states = []; } pushState(memento) { this.states.push(memento); } popState() { return this.states.pop(); } } // 使用示例 const editor = new TextEditor(); const history = new HistoryManager(); editor.type("Hello"); history.pushState(editor.save()); // 保存状态1 editor.type(" World"); console.log(editor.getContent()); // "Hello World" // 撤销操作 editor.restore(history.popState()); console.log(editor.getContent()); // "Hello" [^3] ``` ##### 示例2:新闻数据缓存器(减少服务器请求) ```javascript // 备忘录模式实现数据缓存 const NewsCache = (() => { const cache = {}; // 存储页面数据 return { fetchPage(page) { // 1. 检查缓存 if (cache[page]) { console.log(`从缓存加载第${page}页`); return cache[page]; } // 2. 无缓存则请求服务器(模拟) console.log(`请求服务器: 第${page}页`); const data = `第${page}页数据`; cache[page] = data; // 存入缓存 return data; } }; })(); // 使用示例 console.log(NewsCache.fetchPage(1)); // 请求服务器 console.log(NewsCache.fetchPage(1)); // 从缓存加载 [^4][^5] ``` #### 应用场景 1. **撤销/重做功能** 如文本编辑器的 `Ctrl+Z` 操作[^2]。 2. **数据缓存** 缓存 API 响应减少网络请求(如示例2)[^4]。 3. **游戏存档** 保存和恢复游戏角色状态。 4. **表单草稿保存** 用户离开页面时自动保存表单状态。 #### 优势与注意事项 | 优势 | 注意事项 | |------|----------| | ✅ 状态封装性:不暴露对象内部细节 | ⚠️ 内存消耗:大量状态可能占用内存 | | ✅ 简化发起人逻辑:状态管理职责分离 | ⚠️ 深拷贝问题:复杂对象需深拷贝 | | ✅ 时间回溯:支持历史状态恢复 | ⚠️ 性能影响:频繁保存可能影响性能 | > 关键设计原则:通过备忘录对象中介状态存取,确保发起人内部状态不被外部直接访问[^3]。 --- ### 相关问题 1. 备忘录模式与状态模式有何区别? 2. 如何优化备忘录模式的内存占用问题? 3. 在 Vue/React 中如何实现备忘录模式? 4. 备忘录模式如何结合本地存储(LocalStorage)实现持久化? 5. 哪些场景不适合使用备忘录模式?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值