这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要介绍了 javascript 单例模式详解及简单实例的相关资料, 需要的朋友可以参考下
JS 单例模式
概要:
单例指一个类只有一个实例,这个类自行创建这个实例。
利用对象字面量直接生成一个单例:
- var singleton = {
- prop: 1,
- method: function(){
- console.log(a); //1
- }
- }
严格的说对象字面量可能不算单例模式,生成单例是对象字面量的作用(已经被封装),而单例模式是一个设计模式(需要自行构思或设计)。
在类内部用 new 生成实例的单例模式:
- var instance;
- var foo = function(){
- if(!instance){
- instance = new Singleton();
- }
- return instance;
- function Singleton(){
- this.name = 'single';
- this.method = function(){
- console.log(this.name);
- }
- };
- }
- var a = foo();
- var b = foo();
- a.method(); //single
- console.log(a === b); //true
单例模式只要检测一个实例是否被生成。假如没有实例,则生成实例。假如已经生成则返回这个实例。保证这个类只有这一个实例。
由于 hoisting,函数会提前声明,所以 singleton 函数放在哪都没所谓,但是每次调用都会声明函数 singleton,可能会不够优雅。
由于 new 关键字是执行函数,同时 this 指向这个对象,所以可以判断类的 this 是否赋值给 instance:
- var instance;
- var Singleton = function(){
- if(instance){
- return instance;
- }
- instance = this;
- this.name = 'single';
- this.method = function(){
- console.log(this.name);
- }
- }
- var a = new Singleton();
- var b = new Singleton();
- a.method(); //single
- console.log(a === b); //true
这个例子中,把 instance 指向了 Singleton 这个类,然后在类外部通过 new 来实例化,和上例中的 new 异曲同工。由于是通过修改 this 来达到检测是否执行过 Singleton 类,所以个人感觉不够语义化。
上面的例子用 es6 重构的写法。
类内部 new 生成单例:
- var instance;
- class foo{
- static Singleton(){
- if(!instance){
- instance = new foo();
- }
- return instance;
- }
- method(){
- this.name = 'single';
- console.log(this.name);
- }
- }
- var a = foo.Singleton();
- var b = foo.Singleton();
- a.method(); //single
- console.log(a === b); //true
修改 this 指向生成单例:
- var instance;
- class foo{
- constructor(){
- if(!instance){
- this.Singleton();
- }
- return instance;
- }
- Singleton(){
- instance = this;
- this.name = 'single';
- this.method = function(){
- console.log(this.name);
- }
- }
- }
- var a = new foo();
- var b = new foo();
- a.method(); //single
- console.log(a === b); //true
当然除了这两种以外还有别的方式能实例化一个单例。
来源: http://www.phperz.com/article/17/0526/327668.html