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

What kind of Javascript design pattern / approach is it?

本文关键字:设计模式 方法 Javascript 什么样      更新时间:2023-09-26

看看代码,告诉我它是什么样的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 的库时会发生什么,该库也定义了加法和乘法方法,但适用于向量。最后定义的方法将覆盖先前定义的方法,从而破坏一些依赖于它们的代码。

出于这个原因,最好不要污染全局范围,当您有希望提供的功能时,通过命名空间(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()),否则你无法轻易分辨它们属于哪个"组"。