Pro Javascript设计模式勘误表?

Pro Javascript设计模式勘误表?,javascript,design-patterns,errata,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() {/

有人能确认这些来自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');

作为一个很好的选择,请查看以下内容:

对于不可变的公共属性,正如建议的那样,请使用Object.freeze和John Resig的建议:


为了不破坏您的全局范围,请将名称空间添加到jQuery:

对任何声称“专业”的东西都要小心。我没有读过这本书,但我对代码的理解如下:

> var Class = (function() {
> 
>   // Constants (created as private static attributes).
“属性”一词是错误的,它应该是“属性”或“变量”,因为它们是变量,也可以描述为本地激活/变量对象的属性

>   var UPPER_BOUND = 100;
> 
>   // Privileged static method.  
>   this.getUPPER_BOUND() {//sic
代码将在全局上下文中执行,其中
是窗口/全局对象。因此如果有一个全局*getUPPER_BOUND*函数,则调用该函数时不带任何参数。它后面是一个大括号({),它在一个块不能被打开的地方打开一个块,所以这是一个语法错误

我认为以下内容是有意的:

    this.getUPPER_BOUND = function() {
这将创建全局/窗口对象的getUPPER_BOUND属性,该属性在运行代码时由RHS上的匿名函数分配

>     return UPPER_BOUND;   }
> 
>   ...
> 
>   // Return the constructor.
>   return function(constructorArgument) {
这是分配给全局变量“Class”的函数

有了修复,它可能会“起作用”,但并不优雅。任何代码中有如此明显错误的书都没有经过仔细编写,当然在出版之前也没有经过适当的审查


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

我认为,这是错误的。如前所述,“这”引用窗口对象,代码也有语法错误。以下代码应实现所需目标:

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'));

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

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

代码可以简单地固定为

var Class = {
  UPPER_BOUND: 100
};
代码的其余部分设计过度或完全错误,应该忽略

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


这样做怎么样

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

是的,一般来说,我已经有7年没读过一本书了。我知道有一些不错的,但我在网上得到了我需要的一切。谢谢你的链接。我认为揭示模块模式对枚举和单例非常有用。如果我错了,请原谅,但我不认为所提供的任何模式都可以用于给类提供公共imm如果该类的实例化是不受限制的,这就是我问题中转录的模式的意图。你知道有任何模式成功地实现了这个意图吗?我正在考虑使用Object.freeze(obj.prototype)结合链接中自定义对象标题下演示的公式。没错,那篇文章没有谈到不可变的公共属性。我认为这一概念在编写时并不存在。Object.freeze确实做到了这一点,请查看John Resig关于它的精彩文章:。请注意,这需要更高级的功能javascript支持。这是另一种考虑。我通过添加一个简单的名称空间插件()我仍然认为我发布的klauskomenda文章中概述的原则非常合理。@Milimetric你读过RobG的答案吗?代码甚至在语法方面都不有效。而且名称空间是模块加载的工具,而不是模块编写JavaScript不是经典的。学习原型或使用另一种语言?阅读JS:好的部分,而不是你正在阅读的内容。@GlennFerrieLive主要是为了记录,我确实知道原型继承机制,但可以理解为什么你认为其他方法可以避免getConstant成为window属性的问题,但我们仍然必须这样做实例化类。这样如何?直接返回方法。这样,我们不必首先初始化类。现在的问题是我们无法实例化类。我的问题是上界是可变的,因此constantI也不会将可配置设为false,但这是可行的-谢谢。我想这本书是在这是我们的目标。defineProperty@Joffer始终保持“可配置”为真。当你尝试对类/库/第三方进行修补或扩展时,当你意识到你无法覆盖或删除属性时,你就会诅咒该库如此死板。这本书希望通过使用特权静态方法来展示这一点,但我们他们的例子没什么错。谢谢。
var Class = {};
Object.defineProperty(Class, "UPPER_BOUND", {
  value: 100,
  enumerable: true,
  configurable: true
});
/* 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"));