【问题标题】:Storing reusable constant in namespaces in JavaScript在 JavaScript 的命名空间中存储可重用常量
【发布时间】:2012-12-28 04:50:35
【问题描述】:

请不要指给我Static variables in JavaScript

我的问题更具体。我是 JS 的新手(只是读了几本书,看一些截屏视频,并阅读关于 JS 中的 monoins/monads 的博客文章)所以请耐心等待))

为了存储可重用的常量,我编写了这样的代码:

函数 SVGobj(w, h) { this.value = document.createElementNS(SVGobj.svgNS, "svg"); this.value.setAttribute("版本", "1.2"); this.value.setAttribute("宽度", w); this.value.setAttribute("身高", h); } SVG obj.svgNS = "http://www.w3.org/2000/svg"; 函数 SVGCircle(cx, cy, r) { this.value = document.createElementNS(SVGobj.svgNS, "circle"); this.value.setAttribute("cx", cx); this.value.setAttribute("cy", cy); this.value.setAttribute("r", r); }

上面的代码正在运行。 SVGCircle 重用常量 SVGobj.svgNS

但我不明白 SVGobj.svgNS = 表达式。 根据 JS 规范使用 JS 表达式是否合法?

请注意,这样的代码会失败:

var SVGobj = {}; SVG obj.svgNS = "http://www.w3.org/2000/svg"; 函数 SVGobj(w, h) { this.value = document.createElementNS(SVGobj.svgNS, "svg"); this.value.setAttribute("版本", "1.2"); ... } ……

有错误:

TypeError:SVGobj.prototype 未定义

当我尝试实例化 new SVGobj(320, 240);

为什么?

我可以通过 new 运算符但从 "var Cls = {};" 表达式开始创建对象吗?

有人建议使用:

函数 SVGobj(w, h) { if (typeof SVGobj.svgNS == 'undefined' ) { SVG obj.svgNS = "http://www.w3.org/2000/svg"; } …… }

为什么使用每次创建对象时评估的if?我的第一个例子对我来说似乎更自然......

【问题讨论】:

标签: javascript design-patterns constructor


【解决方案1】:

但我不明白 SVGobj.svgNS = 表达式。是否合法使用 根据 JS 规范的 JS 表达式?

是的,SVGobj 是一个函数,而 svgNS 是函数的一个属性。

当我尝试实例化新的 SVGobj(320, 240);为什么?

是名称冲突。

var SVGobj = {}; SVG obj.svgNS = "http://www.w3.org/2000/svg";

被以下内容覆盖:

函数 SVGobj(w, h) { this.value = document.createElementNS(SVGobj.svgNS, "svg"); this.value.setAttribute("版本", "1.2"); ... }

不要忘记 Javascript 不是面向对象的语言。

我可以通过 new 运算符创建对象,但从“var Cls = {};”开始 表达方式?

这个表达式等于({}只是一个捷径)

var Cls = new Object();

为什么每次创建对象时都使用 if which 评估?我的第一次 这个例子对我来说似乎更自然......

第一个示例比 if 解决方案更好,但代码可能更简洁。(但它总是可以。;-)

【讨论】:

  • 感谢您回答我的所有问题。 +1
【解决方案2】:

在这段代码中:

var SVGobj = {};
SVGobj.svgNS = "http://www.w3.org/2000/svg";
function SVGobj(w, h) {
    this.value = document.createElementNS(SVGobj.svgNS, "svg");
    this.value.setAttribute("version", "1.2");
    ...
}

你正在覆盖:

var SVGobj = {};

与:

function SVGobj(w, h) {

SVGobj.svgNS 那时已经不存在了。

您可能想要执行以下操作:

SVGobj = function (w, h) {
    this.value = document.createElementNS(this.svgNS, "svg");
    this.value.setAttribute("version", "1.2");
    this.svgNS = "http://www.w3.org/2000/svg";

    return {
        svgNS: this.svgNS
    };
};

var o = new SVGobj(100, 100)
console.log(o.svgNS);
// http://www.w3.org/2000/svg

【讨论】:

  • 哇!感谢您的解释! +1
  • 嗯...永远不会在 JS“构造函数”中看到 return {...} 构造。有什么诀窍?
  • 诀窍是从new SVGobj(100, 100) 返回的对象现在还有一个属性svgNS,它引用了内部this.svgNS 属性。
  • Hm... 在这种情况下,代码 console.log(SVGobj.svgNS); return undefined... ((无需实例化 SVGobj 即可被其他模块和类重用...
猜你喜欢
  • 2023-03-23
  • 2014-07-05
  • 1970-01-01
  • 2011-12-08
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2016-07-26
相关资源
最近更新 更多