1

JavaScript の静的変数を教えないでください

私の質問はより具体的です。私はJSの初心者です(数冊の本を読んだり、スクリーンキャストを見たり、JSのモノイン/モナドに関するブログ記事を読んだりするだけです)ので、しばらくお待ちください))

再利用可能な定数を格納するには、次のようなコードを記述します。

関数 SVGobj(w, h) {
    this.value = document.createElementNS(SVGobj.svgNS, "svg");
    this.value.setAttribute("バージョン", "1.2");
    this.value.setAttribute("幅", w);
    this.value.setAttribute("高さ", h);
}
SVGobj.svgNS = "http://www.w3.org/2000/svg";

関数 SVGCircle(cx, cy, r) {
    this.value = document.createElementNS(SVGobj.svgNS, "円");
    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("バージョン", "1.2");
    ...
}
....

エラーあり:

TypeError: SVGobj.prototype が定義されていません

新しい SVGobj(320, 240);をインスタンス化しようとすると

なんで?

「var Cls = {};」から始まる新しい演算子でオブジェクトを作成できますか? 表現?

誰かが使用することを提案します:

関数 SVGobj(w, h) {
    if (typeof SVGobj.svgNS == '未定義' ) {
        SVGobj.svgNS = "http://www.w3.org/2000/svg";
    }
   ....
}

オブジェクトを作成するたびにif which を評価するのはなぜですか?? 私の最初の例は、私にはより自然に思えます...

4

2 に答える 2

3

しかし、 SVGobj.svgNS = 式がわかりません。JS仕様に従ったJS式の合法的な使用はありますか?

はい、SVGobjは関数であり、svgNSは関数のプロパティです。

新しい SVGobj(320, 240); をインスタンス化しようとすると なんで?

名前の競合です。

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

によってオーバーライドされます:

function SVGobj(w, h) { this.value = document.createElementNS(SVGobj.svgNS, "svg"); this.value.setAttribute("バージョン", "1.2"); ... }

Javascript は ObjectOriented 言語ではないことを忘れないでください。

「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 に答える