Pro Javascript设计模式勘误表?
有人能确认这些来自Pro Javascript设计模式第3章的示例有缺陷吗?如果有,从根本上说,这些示例离在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() {/
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"));