任何人都可以确认 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');
答案 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"));