1

请不要将我指向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 未定义

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

为什么?

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

有人建议使用:

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

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

4

2 回答 2

3

但我不明白 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解决方案更好,但代码可能更简洁。(但它总是可以。;-)

于 2013-01-14T08:20:59.263 回答
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
于 2013-01-14T08:06:15.037 回答