原文连接:My Favorite JavaScript Design Pattern
译文原链:【译】我最喜欢的 JavaScript 设计模式javascript
我以为聊一下我爱用的 JavaScript 设计模式应该颇有意思。我是一步一步才定下来的,通过一段时间从各类来源吸取和适应直到达到一个能提供我所需的灵活性的模式。java
让我给你看看概览,而后再来看它是怎么造成的:设计模式
function MyScript(){} (function() { var THIS = this; function defined(x) { return typeof x != 'undefined'; } this.ready = false; this.init = function( { this.ready = true; }; this.doSomething = function() { }; var options = { x : 123, y : 'abc' }; this.define = function(key, value) { if(defined(options[key])) { options[key] = value; } }; }).apply(MyScript);
如你在实例代码中看到的,总体框架是一个函数直接量(function literal):闭包
(function() { ... })();
函数直接量基本上就是一个自执行域,至关于定义一个有名的函数而后当即调用它:app
function doSomething() { ... } doSomething();
我最初开始使用函数直接量是为了封装
——任何格式的任何脚本均可以被封装在那个闭包里,而且它有效地将它密封
在私有域中,从而保护它不会与同一个域里的其它脚本或者数据冲突。在最后面的那一对括号就是在执行这个域,就像其它函数同样调用它。框架
可是若是,这个域经过使用 Function.apply
来执行而不是全局调用,这可让它在一个可被外界引用的特定命名的域中执行。函数
所以经过结合两者——建立一个命名函数,而后在这个命名函数的域内执行一个函数直接量——咱们就获得了一个一次性的能够构成任何脚本的基础的对象,它模拟了相似面向对象类的继承性质。this
看看第一个代码示例,你就能看到封闭域结构提供了什么样的灵活性。固然,这些你均可以在任何方法中作到,可是经过用这种方式包装起来,咱们就有了一个能够和任何命名域联系起来的结构体。设计
咱们能够建立多个这样的结构体,而后将它们和同一个域联系起来,这样它们之间所有能够共享它们的公开数据。code
不过在共享公开数据的同事,每个(结构体)也能够定义它本身的私有数据。下面是一个例子,在脚本的最上面:
var THIS = this;
咱们建立了一个叫作 THIS
的私有变量,它指向这个函数域,而且能够在私有方法中使用——和用 self = this
来建立内部域是同样的招数。
经过一样方式声明的其余私有变量,若是他们定义常量数据的话,可使用大写传统(不过用 const
而不是 var
来作声明的方式应该被避免,由于对它的支持不是很好)。
私有方法能够用来提供内部功能:
function defined(x) { return typeof x != 'undefined'; }
而后咱们能够建立其余实例或者外界能够访问的公开方法和属性:
this.ready = false; this.init = function() { this.ready = true; }; this.doSomething = function() { };
咱们也能够建立特殊的值——私有可是能够公开定义,在这个例子中是经过公开的 define
方法;它的参数能够根据数据须要再进行验证:
var options = { x : 123, y : 'abc' }; this.define = function(key, value) { if(defined(options[key])) { options[key] = value; } };
全部的这些特色让这个结构体对我很是有用。而且它封装在一个整洁、自我执行的单例中——一个容易引用、整合和使用的一次性对象。
因此你怎么想?这个模式眼熟吗,或者你有什么其余喜欢用的?