今天是2018/07/02, 今天继续带大家走进 js 底层的设计模式 , 作为一个web工程师,我想次面试,都
会问道 html 、js 、css 、这些基本的知识点,很少问到他的设计模式,
1. 单例模式
单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式是接近传统面向对象语言中的实现,要实现一个标准的单例模式并不复杂,无非是用一个变量
来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象
单例对象从“类”中创建而来。在以类为中心的语言中,这是很自然的做法。但是JavaScript 其实是一门动态类型、
弱类型、基于原型的语言,javascript 是没有 类 和 接口 定义的.
示例如下:
var Singleton = function( name ){
this.name = name;
this.instance = null;
};
Singleton.prototype.getName = function(){
alert ( this.name );
};
Singleton.getInstance = function( name ){
if ( !this.instance ){
this.instance = new Singleton( name );
}
return this.instance;
};
var a = Singleton.getInstance( 'sven1' );
var b = Singleton.getInstance( 'sven2' );
alert ( a === b ); // true
或者是
var Singleton = function( name ){
this.name = name;
};
Singleton.prototype.getName = function(){
alert ( this.name );
};
Singleton.getInstance = (function(){var instance = null;
return function( name ){
if ( !instance ){
instance = new Singleton( name );
}
return instance;
}
})();
这种方式相对比较简单.
在 JavaScript 开发中,我们经常会把全局变量当成单例来使用。例如:
var a = {};
但是 全局变量 不是单例模式;当用这种方式创建对象 a 时,对象 a 确实是独一无二的。如果 a 变量被声明在
全局作用域下,则我们可以在代码中的任何位置使用这个变量,全局变量提供给全局访问是理所当然的。
但是全局变量存在很多问题,它很容易造成命名空间污染。在大中型项目中,如果不加以限制和管理,
程序中可能存在很多这样的变量。JavaScript 中的变量也很容易被不小心覆盖,相信每个 JavaScript 程序员
都曾经历过变量冲突的痛苦,就像上面的对象 var a = {};,随时有可能被别人覆盖。解决方案如下
1. 使用命名空间适当地使用命名空间,并不会杜绝全局变量,但可以减少全局变量的数量。
最简单的方法依然是用对象字面量的方式:
var namespace1 = {
a: function(){
alert (1);
},
b: function(){
alert (2);
}
};
2. 使用闭包封装私有变量
var user = (function(){
var __name = 'sven',//私有变量
__age = 29;//私有变量
return {
getUserInfo: function(){
return __name + '-' + __age;
}
}
})();
单例模式是一种简单但非常实用的模式,在合适的时候才创建对象,并且只创建唯一的一个。
点击查看下一篇 : 策略模式和迭代器模式.