Про Javascript Design Patterns опечатки? - PullRequest
2 голосов
/ 26 мая 2011

Может ли кто-нибудь подтвердить, что эти образцы из Главы 3 Pro Javascript Design Patterns имеют недостатки и, если да, то насколько они фундаментальны - они более чем опечатка или два от достижения намеченной цели «класса»константы в JavaScript?Спасибо.

var Class = (function() {

  // Constants (created as private static attributes).
  var UPPER_BOUND = 100;

  // Privileged static method.
  this.getUPPER_BOUND() {//sic
    return UPPER_BOUND;
  }

  ...

  // Return the constructor.
  return function(constructorArgument) {
    ...
  }
})();

/* Usage. */

Class.getUPPER_BOUND();

/* Grouping constants together. */

var Class = (function() {

  // Private static attributes.
  var constants = {
    UPPER_BOUND: 100,
    LOWER_BOUND: -100
  }

  // Privileged static method.
  this.getConstant(name) {//sic
    return constants[name];
  }

  ...

  // Return the constructor.
  return function(constructorArgument) {
    ...
  }
})();


/* Usage. */

Class.getConstant('UPPER_BOUND');

Ответы [ 6 ]

6 голосов
/ 24 июня 2011

Я думаю, это неправильно.Как упоминалось ранее, «this» относится к объекту окна, и код также имеет синтаксическую ошибку.Следующий код должен выполнить требуемую цель:

var Class = (function () {

    // Private static attributes.

    var constants = {
        UPPER_BOUND: 100,
        LOWER_BOUND: -100
    };            

    var sc = function (constructorArgument) {

    };

    // Privileged static method.
    sc.getConstant = function (name) {
        return constants[name];
    };

    // Return the constructor.
    return sc;
})();

alert(Class.getConstant('UPPER_BOUND'));
1 голос
/ 05 декабря 2011

Код может быть тривиально исправлен как

var Class = {
  UPPER_BOUND: 100
};

Остальная часть кода чрезмерно спроектирована или просто неверна и должна игнорироваться.

Если вас интересует только чтение, установитефлаг записи для false (обратите внимание, что по умолчанию установлено значение false).

var Class = {};
Object.defineProperty(Class, "UPPER_BOUND", {
  value: 100,
  enumerable: true,
  configurable: true
});
1 голос
/ 26 мая 2011

Остерегайтесь всего, что претендует на звание "профи".Я не читал книгу, но мой код выглядит следующим образом:

> var Class = (function() {
> 
>   // Constants (created as private static attributes).

Слово «атрибуты» неверно, оно должно быть либо «свойствами», либо «переменными», потому что они являются переменными, который также может быть описан как свойства локального объекта активации / переменной.

>   var UPPER_BOUND = 100;
> 
>   // Privileged static method.  
>   this.getUPPER_BOUND() {//sic

Код будет выполняться в глобальном контексте, где this - это окно / глобальный объект.Так что если есть глобальная функция * getUPPER_BOUND *, она будет вызываться без аргументов.За ним следует фигурная скобка ({), которая открывает блок в месте, где блок не может быть, так что это синтаксическая ошибка.

Я предполагаю, что предполагалось следующее:

    this.getUPPER_BOUND = function() {

, которая создает свойство getUPPER_BOUND объекта global / window, которому при выполнении кода назначается анонимная функция в RHS.

>     return UPPER_BOUND;   }
> 
>   ...
> 
>   // Return the constructor.
>   return function(constructorArgument) {

Эта функция назначена глобальной переменной «Класс».

>     ... 
>   }
>  })();

С исправлениями это может «работать», но не элегантно.Ни одна книга с такими явными ошибками в коде не была тщательно написана и, конечно, не была должным образом рассмотрена перед публикацией.

Используйте авторитетные онлайн-ресурсы и продолжайте задавать вопросы о том, чего вы не понимаете или не думаетев ошибке.Существуют и другие форумы для обсуждения javascript, которые могут дать гораздо более подробные ответы на технические вопросы.

1 голос
/ 26 мая 2011

Проверьте это как хорошую альтернативу: http://www.klauskomenda.com/code/javascript-programming-patterns/

и для неизменяемых общедоступных свойств, как было предложено, используйте полезный совет Джона Резига от Object.freeze: http://ejohn.org/blog/ecmascript-5-objects-and-properties/

ичтобы не загромождать свою глобальную область, добавьте пространства имен в jQuery: Можно ли создать пространство имен в jQuery?

0 голосов
/ 31 января 2012

Как насчет этого?

/* Grouping constants together. */
var Class = (function() {
  // Private static attributes.
  var constants = {
     UPPER_BOUND: 100,
     LOWER_BOUND: -100
  }

  // Return the constructor.
  return new function(constructorArgument) {
     // Privileged static method.
     this.getConstant = function(name) {//sic
       return constants[name];
     }
   }
})();

console.log(Class.getConstant("LOWER_BOUND"));
0 голосов
/ 18 ноября 2011

Понял, что это работает, но не уверен, что это было то, что авторы хотели, чтобы это было.

var Class = (function()
{
    // Constants (created as private static attributes).
    var constants =
    {
        UPPER_BOUND: 100,
        LOWER_BOUND: -100
    };

    // Return the method(s).
    return {
        getConstant: function(name)
        {
            return constants[name];
        }
    }
}());

console.log(Class.getConstant('UPPER_BOUND')); // shows "100" in console
...