当前位置: 首页 > news >正文

湖北智能建站系统价格做微商网站需要哪些

湖北智能建站系统价格,做微商网站需要哪些,后端开发是什么,唐山有制作网站的没本系列文章的思想#xff0c;都融入了 让 Java 再次伟大 这个全新设计的脚手架产品中#xff0c;欢迎大家使用。 单例模式与模块系统 Node 的单例模式既特殊又简单——凡是从模块中导出的实例天生就是单例。 // database.js function Database(connect, account, password)…本系列文章的思想都融入了 让 Java 再次伟大 这个全新设计的脚手架产品中欢迎大家使用。 单例模式与模块系统 Node 的单例模式既特殊又简单——凡是从模块中导出的实例天生就是单例。 // database.js function Database(connect, account, password) {this.connect connect;this.account account;this.password password; } const database new Database(localhost, root, 123456); export default database;// index.js import database1 from ./database.js; import database2 from ./database.js;console.log(database1 database2); // true这是由于 Node.js 加载完某个模块后会创建模块与模块标识符 (module specifier) 的映射关系并将其缓存起来供后续使用就像下面这样 pseudo code (CommonJS module) function loadModule(filename, module, require) {const wrappedSrc (function(module,exports,require) {${fs.readFileSync(filename, utf8)} })(module,module.exports,require);eval(wrappedSrc); }function require(moduleName) {const id require.resolve(moduleName);// 加载缓存if (require.cache[id]) {return require.cache[id].exports;}const module { exports: {} };// 缓存模块require.cache[id] module;loadModule(id, module, require);return module.exports; } require.cache {}; require.resolve function (moduleName) {return moduleName; };得益于 CommonJS module 的缓存功能在 Node 中我们不再需要专门的单例设计模式了。 循环依赖 CommonJS module 基于一个简单的原理在立即执行函数IIFE中创建私有域然后一边执行代码一边构建图。如果 a,b 两个模块互相依赖在 a 模块执行完之前 b 模块中引用了 a 模块导出的 变量就可能会导致 b 模块无法看到 a 模块的最终状态。 ECMAScript Modules 解决这个问题的方式是先通过分析构建图当图构建完毕以后使用后序深度优先遍历从最后一个节点开始执行代码。这样能保证当其他节点依赖这个模块时获取到的模块导出变量为最终状态不会再被 b 模块自身改动。 实时绑定 CommonJS module 的 import 是通过将 b 模块导出对象进行浅拷贝到 a 模块的作用域中来实现的。如果对象的属性是原始类型的话a 模块获得的是一份拷贝b 模块的修改可能无法反映到这份拷贝上。 而 ECMAScript Modules 有一种名叫 live bindings 机制使得 a 模块 import 的 b 模块是一个链接它指向了 b 模块导出的那个对象。如果 b 模块在运行过程中更改了对象中的属性a 模块马上就可以获取到最新的状态。而 CommonJS module 的 import 是通过将 b 模块导出对象进行浅拷贝到 a 模块的作用域中来实现的。如果对象的属性是原始类型的话a 模块获得的是一份拷贝b 模块的修改可能无法反映到这份拷贝上。 Revealing Constructor 如果你想设计一个只能在初始化时改变状态的类就可以采用这种技巧。或者换一种说法该类实例化完毕后就不可变immutable。 可能你会觉得 Revealing Constructor 有点陌生因为它不是我们熟悉的那种设计模式。不过不用担心因为你一定见过它了。在 Node.js 中这个模式运用的很广泛其中最常见的就是 Promise。 pseudo code class TinyPromise {constructor(executor) {this.status pending;this.value undefined;executor(this.resolve);}resolve (value) {this.status resolve;this.value value;};then (func) {if (this.status resolve) {func(this.value);}}; }new TinyPromise((resolve) {resolve(1); }).then((value) {console.log(value); }); // output: 1Proxy 代理装饰与适配 ES 内置的 Proxy 支持在运行期 (runtime) 创建代理对象使通过组合和委派解决问题的设计模式都能通过 Proxy 的方式得到体现消除了硬编码代理类产生的冗余代码。 function Subject() {this.morning () {console.log(morning);};this.bye () {console.log(bye);}; }const subject new Subject();let subjectHandler {get: function (target, prop) {// 返回增强后的方法if (prop morning) {return function () {// 增强逻辑console.log(good);// 调用原对象逻辑target[prop]();};}// 返回原对象中的属性return target[prop];},// set、has、delete... };const enhanceSubject new Proxy(subject, subjectHandler); enhanceSubject.morning(); // good morning enhanceSubject.bye(); // bye通过 Proxy 表达的代理、装饰器、适配器设计模式看起来都差不多差别主要在于应用场景 代理强调对某个对象的访问的控制。装饰器强调对对象属性的增强。适配器则提供与原对象不同的行为以适配新的场景。 Proxy 与对象虚拟化 下面这个例子实现了一个涵盖所有偶数的虚拟化数组——具备数组的行为但不实际存储数据。 const eventNumbers new Proxy([], {get: (target, prop) index * 2,has: (target, number) number % 2 0, }); console.log(2 in eventNumbers); // true console.log(3 in eventNumbers); // false console.log(eventNumbers[7]); // 14举这个例子是想说明Proxy 的作用不仅仅局限于设计模式还有很多其他功能可以用 Proxy 来体现比如「元编程 (meta-programming)、运算符重载 (operator overloading) 和对象虚拟化 (object virtualization)」 Change Observer 与响应式编程 结合 Proxy 的 set 方法 (trapMethod) 还可以实现观察者模式——当某个对象的状态发生变化时通知观察者。 在强类型语言中观察者一般是一个对象由于 js 中的所有函数都是闭包的缘故所以观察者可以是一个回调函数。 // 被观测对象 const invoice {subtotal: 100,discount: 10,tax: 20, };// 状态发生变化时的回调函数(计算票据总额) function calculateTotal(invoice) {return invoice.subtotal - invoice.discount invoice.tax; } // target: 被代理对象 observe: 回调函数(calculateTotal) function createObservable(target, observe) {const observable new Proxy(target, {// obj: 原始对象 prop: 属性 value: 值set(obj, prop, value) {// 如果待设置的属性值和之前的属性不同if (value ! obj[prop]) {const prev obj[prop];obj[prop] value;// callbackobserve({ prop, prev, curr: value });}return true;},});return observable; }let total calculateTotal(invoice); console.log(total); // 120// 创建代理对象(观测该对象属性发生变化) const obsInvoice createObservable(invoice, (change) {console.log(change);console.log(calculateTotal(invoice)); });// 打印票据 total: 210 obsInvoice.subtotal 200; // 打印票据 total: 200 obsInvoice.discount 20; // 打印票据 total: 200 obsInvoice.discount 20; // 打印票据 total: 210 obsInvoice.tax 30; 像上例这样由实例状态的变化来驱动业务而不是由客户端(调用方)来发起业务调用的编程范式称为响应式编程。(reactive programming RP) 结语 代理、装饰器、适配器都是结构型模式体现的设计思想都差不多——通过对象的结构来管理实体间的关系。Proxy 不仅用来实现设计模式也可以用来完成很多其他功能和编程范式。就像 js 中的闭包函数一样模块导出天生就是单例。
http://www.dnsts.com.cn/news/111276.html

相关文章:

  • 茶叶网站建设一般的风格wordpress 恢复
  • python 网站开发 环境网络培训机构排名
  • wordpress如何建立网站中文在线っと好きだっ最新版
  • 用ps切片做网站联系导师邮件模板
  • 建网站的每年有费用wordpress json
  • asp.net网站开发百科深圳坪山网站制作公司
  • 万网网站编辑网站开发好做吗
  • 微网站 建设方案网站制作公司在哪里找
  • 做网站汉狮网络京东建站模板
  • 行业网站开发网站建设首选九零后网络
  • 单页面网站做百度推广效果瑞安自适应网站建设
  • 做网站建设注册商标是多少类辽宁省交通投资建设集团网站
  • 网站建设存在的问题网站设计与制作是什么专业
  • 网站后台上传图片不显示pc蛋蛋网站怎么做
  • 找做网站的客户安徽seo网络推广
  • 淮安市网站网页设计作品我的家乡
  • 沈阳市建设工程安全监督站网站软件跟网站开发的区别
  • 用html5做的网站源码今天新闻头条
  • 怀化网站建设网站凡客诚品倒闭了
  • 网站建设方案范文1000字岐山网站开发
  • 电子商务网站建设报告怎么写如何做卖菜网站
  • 邢台网站建设有哪些网站开发过程中出现的问题
  • 做化妆品注册和注册的网站wordpress ality
  • 网站开发应该怎么学让人做网站需要准备什么软件
  • 企业网站seo诊断报告阳江市问政平台留言
  • 镇江公司做网站dw个人网站制作
  • 网站建设能挣钱吗wordpress slug translate
  • 做网站高亮怎样在谷歌做网站
  • 无锡免费网站制作莱芜昨天下午又死了7个
  • 扬州网站建设开发宁波网站制作公司排名