请不要将我指向Static variables in JavaScript

我的问题更具体。我是JS的新手(请读几本书,看一些屏幕录像,并阅读有关JS中monoins / monad的博客文章),请耐心等待)

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

函数SVGobj(w,h){
    this.value = document.createElementNS(SVGobj.svgNS,“ svg”);
    this.value.setAttribute(“ version”,“ 1.2”);
    this.value.setAttribute(“ width”,w);
    this.value.setAttribute(“ height”,h);
}
SVGobj.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 = {};
SVGobj.svgNS =“ http://www.w3.org/2000/svg”;
函数SVGobj(w,h){
    this.value = document.createElementNS(SVGobj.svgNS,“ svg”);
    this.value.setAttribute(“ version”,“ 1.2”);
    ...
}
....


错误:

TypeError:SVGobj.prototype未定义


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

为什么?

我可以由新运算符创建对象,但可以从“ var Cls = {};”开始表达?

有人建议使用:

函数SVGobj(w,h){
    如果(typeof SVGobj.svgNS =='undefined'){
        SVGobj.svgNS =“ http://www.w3.org/2000/svg”;
    }
   ....
}


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

最佳答案

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


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


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


是名称冲突。


  var SVGobj = {};
  SVGobj.svgNS =“ http://www.w3.org/2000/svg”;


被以下内容覆盖:


  函数SVGobj(w,h){
      this.value = document.createElementNS(SVGobj.svgNS,“ svg”);
      this.value.setAttribute(“ version”,“ 1.2”);
      ...}


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


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


此表达式等于({}仅是捷径)

var Cls = new Object();



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


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

关于javascript - 在JavaScript中的 namespace 中存储可重用常量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14314868/

10-11 15:10