Закрытие против классического класса - PullRequest
0 голосов
/ 21 сентября 2011

Я использую Node.js.

Не могли бы вы сказать, в чем преимущество использования этого (закрытие):

function sayHello() {
    var num = 0;

    var sayAlert = function (val) {
        num++;
        console.log(num);
    }

    return sayAlert;
}

по сравнению со старым классическим:

function sayHello2() {
    var num = 0;

    this.sayAlert = function (val) {
        num++;
        console.log(num);
    }

}

var ee1 = sayHello();
ee1(5);
ee1(6);

var ee2 = new sayHello2();

ee2.sayAlert(5);
ee2.sayAlert(6);

(возможно, более короткий код для закрытия и больше "JavaScipt way"?)

Ответы [ 3 ]

3 голосов
/ 21 сентября 2011

Похоже, что вы действительно ищете функцию со статическим счетчиком. Для этого вы можете просто использовать немедленно выполняемую функцию.

var say = (function() {
   var num = 0;
   return function (val) {
      // Not sure why you're passing val here, it's not used
      num++;
      console.log(num);
   }
})();

Если вам не нужны несколько счетчиков, вам следует использовать более подходящие имена, чтобы всем было понятно, кто их читает.

function createCounter() {
  var num = 0;
  return function () {
     console.log(++num);
  }
}

Во втором примере вы реализовали то же самое с помощью счетчика на закрытии конструктора, назовем его Speaker.

function Speaker() {
  var num = 0;
  this.sayAlert = function()  { 
    console.log(++num);
  }
}

Они все делают одно и то же

say(); say();  //outputs 1,2
var speaker = new Speaker();
speaker.sayAlert(); speaker.sayAlert(); //outputs 1,2
var speaker2 = new Speaker();
speaker2.sayAlert(); speaker2.sayAlert(); //outputs 1,2

var ctr1 = createCounter(); ctr1(); ctr1(); //outputs 1,2
var ctr2 = createCounter(); ctr2(); ctr2(); //outputs 1,2

Какой из них использовать, зависит от того, хотите ли вы функцию или объект. И в основном, предпочитаете ли вы писать функциональный или ОО-код.

2 голосов
/ 21 сентября 2011

Ни лучше. Это зависит от ваших потребностей.

Они почти идентичны, за исключением того, что один возвращает функцию, а другой возвращает объект, который содержит функцию.

1 голос
/ 21 сентября 2011

Второй пример позволяет использовать более одного метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...