繁体   English   中英

这是一种什么样的Javascript设计模式/方法?

[英]What kind of Javascript design pattern / approach is it?

只是看一下代码,然后告诉我这是哪种Javascript方法?

var Arithmetic = function(){
  var obj = {
    add: function(a,b) { return a + b; },
    multiply: function(a,b) { return a * b; }
  };
  return obj;
}();

var resultAdd = Arithmetic.add(a,b);
var resultMul = Arithmetic.multiply(a,b);

人们为什么以这种方式编写js代码。...以这种方式编写有任何优势。

上面的代码与任何设计模式有关? 如果是,请告诉我名字。

我总是以这种方式编写代码,而且很容易理解。

function add(a,b)
{
return a+b;
}

function multiply(a,b)
{
return a*b;
}

我只是这样称呼它

var x=add(2,3);
var y=multiply(5,8);

还告诉我用我的方式编写代码的缺点是什么。

用自己的方式编写代码的缺点是,您在全局名称空间中放置了很多东西。 想象一下,当您添加定义对数字起作用的加法和乘法方法的代码,然后包含一个处理Vector的库时,会发生什么情况,该库也定义了add和乘法方法,但对向量起作用。 最后定义的方法将覆盖先前定义的方法,从而破坏一些依赖于它们的代码。

因此,最好不要污染全局范围,并且当您希望使用某些功能时,请通过名称空间( Arithmetic.add()而不是add() )使其可用。

如果稍微分析一下代码,则var obj不在全局范围内定义,而是在匿名函数的范围内定义,因此它之外的代码可以将obj名称用作变量而不会发生冲突。 通过从匿名函数返回具有两个属性的对象,可以将该功能(两种方法)导出给公众使用。 由于不需要两个方法中的多个实例,因此匿名函数会立即返回( http://en.wikipedia.org/wiki/Immediately-invoked_function_expression )。

这种模式的另一个优点是它允许具有私有变量:

var uniqueId = function() {
  var id = 0;
  return function() { return id++; }
}();

uniqueId(); // 0
uniqueId(); // 1

在上面的示例中,由于您只公开了所需的功能接口,而不是整个机制,因此无法意外破坏uniqueId函数以提供不良(非唯一)结果。

考虑一下您的样式中的等效项:

var id = 0;
function uniqueId() { return id++; };

uniqueId(); // 0
id = 0;
uniqueId(); // 0

您提供给我们的代码是面向对象代码的高级示例。 我现在真的看不到封装的obj的优点,这只会使事情难以阅读。 基本上, Arithmetic充当静态类。 如果没有封装的obj和自我执行功能,它可能会这样写:

var Arithmetic = {
    add:       function(a,b) { return a + b; },
    multiply:  function(a,b) { return a * b; }
}

您提供给我们的代码确实具有相同的功能-它只是不会直接写下该对象,而是使用该自执行函数(即闭包,即所谓的“无名称的函数”)创建该对象(通过添加()对其进行创建)。

OO代码的优点并不是很难简单地归结为几行,而是将静态类视为方法的集合(如此处所述):它具有封装性。您可以将创建的每个类/对象都视为黑盒,不必担心细节(当然可以)。

您的“传统”方法的缺点是:一旦拥有许多函数,它就会变得混乱,除非您在命名约定中包括thst(例如math_add()math_mul() ,否则您就无法轻易分辨它们属于哪个“组” math_mul()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM