0

只需查看代码并告诉我它是哪种 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);

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

4

2 回答 2

2

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

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
于 2013-11-13T11:40:32.437 回答
-2

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

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

你给我们的代码确实是一样的——它只是不直接写下那个对象,而是使用那个自执行函数创建它(这是一个闭包,一个“没有名字的函数”,被调用(通过添加()到它) 创建后立即)。

OO 代码的优点并不是很容易用几行代码来概括,而是将静态类视为方法的集合(就像这里所做的那样):它是封装。您可以将创建的每个类/对象视为黑盒,并且不必担心细节(当然,一旦它起作用了)。

您的“传统”方法的缺点是:一旦您获得了很多很多功能,它就会被束缚,并且您无法轻易分辨它们属于哪个“组”,除非您在命名约定中包含 thst(例如math_add()or math_mul()

于 2013-11-13T11:37:12.297 回答