原文链接:My Favorite JavaScript Design Pattern
译文原链:【译】我最喜好的 JavaScript 设想形式
我最喜好的 JavaScript 设想形式
我以为聊一下我爱用的 JavaScript 设想形式应当很有意义。我是一步一步才定下来的,经由一段时间从种种泉源吸取和顺应直到到达一个能供应我所需的灵活性的形式。
让我给你看看概览,然后再来看它是怎样组成的:
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()
{
...
})();
函数直接量基本上就是一个自实行域,相当于定义一个著名的函数然后马上挪用它:
function doSomething()
{
...
}
doSomething();
我最初开始运用函数直接量是为了封装
——任何花样的任何剧本都能够被封装在谁人闭包里,而且它有效地将它密封
在私有域中,从而庇护它不会与同一个域里的别的剧本或许数据争执。在末了面的那一对括号就是在实行这个域,就像别的函数一样挪用它。
然则假如,这个域经由过程运用 Function.apply
来实行而不是全局挪用,这能够让它在一个可被外界援用的特定定名的域中实行。
因而经由过程连系两者——建立一个定名函数,然后在这个定名函数的域内实行一个函数直接量——我们就得到了一个一次性的能够组成任何剧本的基本的对象,它模拟了相似面向对象类的继续性子。
内涵之美
看看第一个代码示例,你就可以看到关闭域构造供应了什么样的灵活性。固然,这些你都能够在任何要领中做到,然则经由过程用这类体式格局包装起来,我们就有了一个能够和任何定名域联系起来的构造体。
我们能够建立多个如许的构造体,然后将它们和同一个域联系起来,如许它们之间悉数能够同享它们的公然数据。
不过在同享公然数据的同事,每个(构造体)也能够定义它自己的私有数据。下面是一个例子,在剧本的最上面:
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;
}
};
封装起来!
一切的这些特性让这个构造体对我异常有效。而且它封装在一个整齐、自我实行的单例中——一个轻易援用、整合和运用的一次性对象。
所以你怎样想?这个形式眼熟吗,或许你有什么其他喜好用的?