保证一个类只有一个实例, 并提供一个访问它的全局访问点。
2、如何实现一个单例模式
实现一个简单的单例模式:
创建一个类,类中有一个方法能够创建该类的实例对象,还有一个标记,记录是否创建过实例对象。创建过则直接用实例对象的引用。否则再次创建
3、什么情况可以使用单例模式(有什么用处)
(1)缓存数据(点击触发获取实验字段时)
(2)获取实例值不确定使用位置获取实例时是否已经有实例。每次调用都走一遍内部逻辑获取实例
使用场景:
Rn
h5页面中同一个路由下写在最上层时
每一个import进来的组件其实都属于一个单例模式
将变量缓存再windows上也是一个单例模式、但windows随意挂载变量的话后续不好维护
vue的双向数据绑定大家应该很熟悉了,当一方的值发生改变时,另一方绑定的值也会随之变化,用起来是挺嗨的。
但是在原生中我们怎么使用这种机制呢?
最近有个需求是通过对接websocket获取后台服务器实时变化的值,推送给web端使用。
基于这个需求,我使用到了js中的设计模式-观察者模式。
那么,让我们来一起了解一下吧。
先来看看具体机制:
这里对象定义了四个属性,分别绑定四个函数。
1、订阅:订阅方通过传递回调函数,观察者模式把这个回调函数push到自身的订阅功能里,以此来得知谁订阅了,然后判断是否要推送。
2、退订:找到对应的回调函数,然后在自身的订阅功能里把当前函数删除掉
3、发布:循环所有的订阅方,当发布方进行发送的时候,把对应的数据推送给订阅方
4、发布订阅:定义一个对象,使其具备订阅并且发布的功能
流程是这样,说起来头头是道的,问题是怎么使用?
举个栗子:
我想定义一个对象,使其具备发布订阅功能,发布方数值改变的时候,订阅方得到平方值得变化
这里通过input框的change事件,模拟了数据的实时变更,然后把当前值进行发布,这边一发布,订阅方就能通过回调函数得到实时变化的值,然后得到值进行相应的操作。
效果:
这样就能简单实现数据变更推送功能了。
注:文件中引入的observer的js是最上面提到的观察者模式的那一套流程,tools的js大家可以不必在意,是我自己原生封装的$函数,用来获取dom元素的。
具体需求,大家还需要变通,稍作修改。
好了,以上就是js的观察者模式实现的双向数据绑定。
如有问题,请指出,接受批评。
1 原型法设计模式在.Net中可以使用clone()来实现原型法
原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展。我们称B的原型为A。
2 javascript的方法可以分为三类:
a 类方法
b 对象方法
c 原型方法
例子:
function People(name)
{
this.name=name
//对象方法
this.Introduce=function(){
alert("My name is "+this.name)
}
}
//类方法
People.Run=function(){
alert("I can run")
}
//原型方法
People.prototype.IntroduceChinese=function(){
alert("我的名字是"+this.name)
}
//测试
var p1=new People("Windking")
p1.Introduce()
People.Run()
p1.IntroduceChinese()
3 obj1.func.call(obj)方法
意思是将obj看成obj1,调用func方法
好了,下面一个一个问题解决:
prototype是什么含义?
javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用。
A.prototype = new B()
理解prototype不应把它和继承混淆。A的prototype为B的一个实例,可以理解A将B中的方法和属性全部克隆了一遍。A能使用B的方法和属性。这里强调的是克隆而不是继承。可以出现这种情况:A的prototype是B的实例,同时B的prototype也是A的实例。
先看一个实验的例子:
function baseClass()
{
this.showMsg = function()
{
alert("baseClass::showMsg")
}
}
function extendClass()
{
}
extendClass.prototype = new baseClass()
var instance = new extendClass()
instance.showMsg()// 显示baseClass::showMsg
我们首先定义了baseClass类,然后我们要定义extentClass,但是我们打算以baseClass的一个实例为原型,来克隆的extendClass也同时包含showMsg这个对象方法。
extendClass.prototype = new baseClass()就可以阅读为:extendClass是以baseClass的一个实例为原型克隆创建的。