You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionVue(options){if(process.env.NODE_ENV!=="production"&&!(thisinstanceofVue)){warn("Vue is a constructor and should be called with the `new` keyword");}this._init(options);}initMixin(Vue);// _init,_uid,$options 当前 Vue 实例的初始化选项,注意:这是经过 mergeOptions() 后的stateMixin(Vue);// $data, $props 设为只读属性,继续添加 $set, $delete, $watcheventsMixin(Vue);// $on, $emit, $off, $oncelifecycleMixin(Vue);// _update, $forceUpdate, $destroyrenderMixin(Vue);// installRenderHelpers 函数中的方法,$nextTick,_rendervarvm1=newVue();varvm2=newVue();vm1._init===vm2._init;// true
前言
当学习深入了解后,发现一些晦涩难懂的技巧与设计模式有关,记录学习日志。
工厂模式
工厂起到的作用就是隐藏了创建实例的复杂度,只需要提供一个函数,把对象放到函数里,用函数封装创建对象的细节。
在 Vue 源码中,你也可以看到工厂模式的使用,比如创建异步组件
在上述代码中,我们可以看到我们只需要调用 createComponent 传入参数就能创建一个组件实例,但是创建这个实例是很复杂的一个过程,工厂帮助我们隐藏了这个复杂的过程,只需要一句代码调用就能实现功能。
构造器模式
构造器模式与工厂模式类似,new 这个对象就是创建对象的实例,实例被标识为特定的类型。构造函数模式一般结合原型进行使用,保证每个实例的方法是同一个。
单例模式
单例模式很常用,比如全局缓存、全局状态管理等这些只需要一个对象,就可以使用单例模式。
单例模式的核心就是保证全局一个类仅有⼀个实例,并提供一个访问它的全局访问点。实现的方法为先判断实例存在与否,如果存在则直接返回,如果不不存在就创建了了再返回,这就确保了了一个类只有一个实例对象。
因为 JS 是门无类的语言,所以别的语言实现单例的方式并不能套入 JS 中,我们只需要用一个闭包变量确保实例只创建一次就行,以下是如何实现单例模式的例子。
也可以构建一个工厂函数,用于将正常的类加工成单例模式的类。
在 Vuex 源码中,你也可以看到单例模式的使用,虽然它的实现方式不大一样,通过一个外部变量来控制只安装一次 Vuex
模块模式
使用
jquery
的 getJSON 方法来获取 github repoList 数据列表发布订阅模式
异步处理逻辑的一种方式,需要做全局存储事件调控中心,在原生开发小程序中有应用,支持先订阅后发布,以及先发布后订阅
适配器模式
适配器用来解决两个接口不兼容的情况,不需要改变已有的接口,通过包装一层的方式实现两个接口的正常协作。
以下是如何实现适配器模式的例子
在 Vue 中,我们其实经常使用到适配器模式。比如父组件传递给子组件一个时间戳属性,组件内部需要将时间戳转为正常的日期显示,一般会使用 computed 来做转换这件事情,这个过程就使用到了适配器模式。
代理模式
代理是为了控制对对象的访问,不让外部直接访问到对象。在现实生活中,也有很多代理的场景。比如你需要买一件国外的产品,这时候你可以通过代购来购买产品。
在实际代码中其实代理的场景很多,比如事件代理、图片预加载就用到了代理模式。
先通过一张 loading 图占位,然后通过异步的方式加载图⽚片,等图⽚加载好了再把
完成的图⽚加载到 img 标签⾥里面。
外观模式
外观模式提供了一个接口,隐藏了内部的逻辑,更加方便外部调用。
举个例子来说,我们现在需要实现一个兼容多种浏览器的添加事件方法
对于不同的浏览器,添加事件的方式可能会存在兼容问题。如果每次都需要去这样写一遍的话肯定是不能接受的,所以我们将这些判断逻辑统一封装在一个接口中,外部需要添加事件只需要调用 addEvent 即可。
装饰者模式
装饰者模式在现在的前端开发场景应用很广泛,如:
connect
方法withouter
方法Form.create
方法getApp()
方法使用@withWeapp('Page') class _C extends Taro.Component {}
传入组件中{ ...data}
解构方法参考
The text was updated successfully, but these errors were encountered: