它是什么样的Javascript设计模式/方法?

时间:2013-11-13 11:27:13

标签: javascript design-patterns

只需查看代码并告诉我它是什么类型的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);

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

2 个答案:

答案 0 :(得分:2)

以自己的方式编写代码的缺点是你在全局命名空间中放了很多东西。想象一下当您添加定义了对数字起作用的add和multiply方法的代码时会发生什么,然后包含一个处理Vectors的库,它也定义了add和multiply方法,但是它们适用于vector。最后定义的方法将覆盖先前定义的方法,打破一些依赖它们的代码。

出于这个原因,最好不要污染全局范围,当您希望提供功能时,可以通过名称空间(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

答案 1 :(得分:-2)

您给我们的代码是面向对象代码的高级示例。我现在没有真正看到那个被obj包围的优势,这让事情变得难以阅读。 基本上Arithmetic充当静态类。如果没有封装的obj和自执行功能,它可能会写成:

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

你给我们的代码确实做了同样的事情 - 它只是没有直接写下那个对象,而是使用那个自动执行的函数创建它(即一个闭包,一个名为“无名称的函数”),被调用(通过在创建后立即添加())。

OO代码的优点并不容易在几行中降低,但是对于静态类作为方法的集合(就像在这里完成的那样):它是encapusulation.You可以将你创建的每个类/对象视为黑盒子,不必担心细节(当然,一旦它工作)。

你的“传统”方法的不利之处在于:一旦你获得了很多很多功能,它就会得到证实,除非你在你的命名约定中包括{{1},否则你不能轻易分辨它们属于哪个“组”。 }或math_add()