Pro Javascript设计模式勘误表?

时间:2011-05-26 02:14:38

标签: javascript design-patterns errata

任何人都可以确认 Pro Javascript设计模式的第3章中的这些样本是有缺陷的,如果是这样的话,从根本上来说 - 它们是否超过了产生预期目标的错误或两个错误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 个答案:

答案 0 :(得分:6)

我认为,这是错误的。如前所述,“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 :(得分:1)

将其视为一个不错的选择:http://www.klauskomenda.com/code/javascript-programming-patterns/

对于不可变的公共属性,如建议的那样,使用Object.freeze和John Resig的好建议:http://ejohn.org/blog/ecmascript-5-objects-and-properties/

并且为了不破坏全局范围,将命名空间添加到jQuery:Is it possible to create a namespace in jQuery?

答案 2 :(得分:1)

警惕任何声称是“专业”的东西。我没有读过这本书,但我对代码的看法如下:

> 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属性,该对象在运行代码时绑定RHS上的匿名函数。

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

这是分配给全局变量“Class”的函数。

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

通过修复,它可以“工作”,但不是优雅的。任何在代码中都有这些明显错误的书籍都没有经过仔细编写,在发布之前肯定没有经过适当的审核。

使用信誉良好的在线资源,继续询问您不理解或认为错误的任何问题。还有其他讨论javascript的论坛可以为技术问题提供更详细的答案。

答案 3 :(得分:1)

代码可以简单地修复为

var Class = {
  UPPER_BOUND: 100
};

其余的代码是过度设计或明显错误的,应该被忽略。

如果您只关心被读取,那么将可写标志设置为false(注意默认值为false)。

var Class = {};
Object.defineProperty(Class, "UPPER_BOUND", {
  value: 100,
  enumerable: true,
  configurable: true
});

答案 4 :(得分:0)

让这个工作,但不确定这是否是作者的意图。

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

答案 5 :(得分:0)

这样做怎么样?

/* 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"));