js几种常见设计模式
Javascript的设计模式,在平时我们接触的很多代码里已经包含了一些设计模式的实现,在这里做个概念性介绍。
Javascript几种常见设计模式
1、单例模式
单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。
eg:点击注册按钮,弹出一个填写注册信息的遮罩层。
var createMask = function(){
return document,body.appendChild( document.createElement(div) );
}
$( 'button' ).click( function(){
Var mask = createMask();
mask.show();
})
代码问题:每次调用createMask都会创建一个新的div, 虽然可以在隐藏遮罩层的把它remove掉. 但显然这样做不合理.
如果可以借助一个变量. 来判断是否已经创建过div呢?
var mask;
var createMask = function(){
if ( mask ) return mask;
else{
mask = document,body.appendChild( document.createElement(div) );
return mask;
}
}
代码问题:函数体内改变了外界变量mask的引用,createMask是个不安全的函数。
var createMask = function(){
var mask;
return function(){
return mask || ( mask = document.body.appendChild( document.createElement('div') ) )
}
}()
解决:用了个简单的闭包把变量mask包起来, 至少对于createMask函数来讲, 它是封闭的.
2、工厂模式
封装一个函数来实现创建类的实例(对象),在函数内部创建一个对象并返回该对象。
function createPerson(name, age) {
var obj = {};
obj.name = name;
obj.age = age;
obj.writeJs = function () {
console.log(this.name + 'write js');
}
return obj;
}
var p1 = createPerson('mengzhe' , 26);
p1.writeJs();
var p2 = createPerson('iceman' , 25);
p2.writeJs();
3、构造函数模式
直接将属性和方法赋给了this对象,不需要创建对象和返回,缺点:每个方法都在实例上创建一遍。
function CreateJsPerson(name, age) {
this.name = name;
this.age = age;
this.writeJs = function () {
console.log(this.name + 'write js');
}
// 浏览器再把创建的实例默认的进行返回
}
var p1 = new CreateJsPerson('iceman' , 25);
p1.writeJs();
var p2 = new CreateJsPerson('mengzhe' , 26);
p2.writeJs();
构造函数与普通函数的区别
构造函数模式和普通函数的模式的区别:
- 执行的时候
- 普通函数执行:CreateJsPerson()
- 构造函数执行:new CreateJsPerson(),通过new执行后,CreateJsPerson就是一个类了,而函数的返回值就是CreateJsPerson这个类的一个实例。
- 在函数代码执行的时候
- 相同:都是形成一个私有的作用域,然后经历:形参赋值 –> 预解释 –> 代码从上到下执行(类和普通的函数一样执行,它也有普通函数的一面)。
- 不同:① 在构造函数的代码执行之前,不用自己再手动的创建对象,浏览器会默认的创建一个对象数据类型的值(这个对象类型的值其实就是当前类的一个实例);② 接下来代码从上到下执行,以当前实例为执行的主体(this代表的就是当前的实例),然后分别的把属性名和属性值赋值给当前的实例;③ 最后,浏览器会默认的把创建的实例返回。
构造函数的this指向:指向当前类的实例
4、原型模式
使用原型对象来实现创建,好处是可以让所有对象实例共享它所包含的属性和方法。
原型对象是什么?
js所有的对象都有一个原型属性,指向原型对象。
原型链
实例与原型对象之间存在的一个链接。
下面我们用原型来实例对象
function Person(){
}
Person.prototype.name = 'sss';
Person.prototype.age = 26;
Person.prototype.sayName = function(){
console.log(this.name);
}
var person1 = new Person();
person1.sayName();
5、观察者模式
我们平时接触的dom事件基本都是观察者模式。
div.onclick = function click (){
alert ( ''click' )
}
只要订阅了div的click事件. 当点击div的时候, function click就会被触发.