3

任何人都可以确认这些来自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');
4

6 回答 6

7

我想,这是错误的。如前所述,“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'));
于 2011-06-23T22:20:50.090 回答
1

看看这是一个很好的选择:http ://www.klauskomenda.com/code/javascript-programming-patterns/

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

为了不破坏全局范围,向 jQuery 添加命名空间:是否可以在 jQuery 中创建命名空间?

于 2011-05-26T02:21:08.160 回答
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 的论坛可以为技术问题提供更详细的答案。

于 2011-05-26T02:42:03.280 回答
1

代码可以简单地固定为

var Class = {
  UPPER_BOUND: 100
};

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

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

var Class = {};
Object.defineProperty(Class, "UPPER_BOUND", {
  value: 100,
  enumerable: true,
  configurable: true
});
于 2011-12-04T23:43:19.587 回答
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
于 2011-11-18T04:32:10.240 回答
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"));
于 2012-01-31T10:32:37.703 回答