2011-05-26 10 views
2

Pro Javascript Design Patternsの第3章にあるこれらのサンプルに欠陥があることを誰もが確かめることができますか?もしそうなら、JavaScriptの意図的な目的を達成するには、ありがとう。Pro Javascriptデザインパターンの正誤情報?

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'); 
+0

Javascriptは古典的ではありません。プロトタイプや他の言語を使用する方法を学んでください。 JS:あなたが読んでいるものではなく、良い部分を読んでください。 –

+0

@GlennFerrieLiveは主にレコードのために、私はプロトタイプの継承メカニズムを知っていましたが、そうでないと仮定した理由を理解することができます – Joffer

答えて

1

コードは自明

var Class = { 
    UPPER_BOUND: 100 
}; 

として固定することができ、コードの残りの部分は、エンジニアまたはプレーン間違った上で、無視してください。

読み取り専用の場合は、書き込み可能フラグをfalseに設定します(デフォルトはfalseです)。

var Class = {}; 
Object.defineProperty(Class, "UPPER_BOUND", { 
    value: 100, 
    enumerable: true, 
    configurable: true 
}); 
+0

ここで私の問題はUPPER_BOUNDが可変であり、したがって一定ではないということです。 – Joffer

+0

@Jofferは今や定数です。 – Raynos

+0

私はfalseでも設定可能なままにしていますが、うまく動作します - ありがとうございます。私はその本がObject.definePropertyよりも先にあると思う。 – Joffer

1

良い代替として、これをチェックアウト:http://www.klauskomenda.com/code/javascript-programming-patterns/

と不変のパブリックプロパティについて、提案されたとして、Object.freezeとジョンResig氏の偉大なアドバイスを使用します。http://ejohn.org/blog/ecmascript-5-objects-and-properties/

とへの道のためにグローバルスコープを壊さず、名前空間をjQueryに追加してください:Is it possible to create a namespace in jQuery?

+0

良いリンクが付いています。 – RobG

+0

ええ、一般的に私は7年のような本を読んでいません。私はいくつかの良いものがあることを知っていますが、私はオンラインで必要なものすべてを手に入れます。 – Milimetric

+0

リンクをありがとう。私はRevealing Moduleパターンが列挙型やシングルトンに役立つと思います。もし私が間違っていたら私を許してください。しかし、クラスのインスタンス化が制限されていなければ、クラスにpublic immutableフィールドを与えることはできません。これは私の中で転記されたパターンの意図です質問。あなたはこの目的をうまく実装したパターンを知っていますか?私はあなたのリンクのカスタムオブジェクトヘッダーの下で示された定式化と一緒にObject.freeze(obj.prototype)を使用することを考えています。 – Joffer

1

"Pro"と何かを慎重にしてください。私は本を​​読むことはなく、下記のようなコードに私のテイクではありませんがあります。

> var Class = (function() { 
> 
> // Constants (created as private static attributes). 

単語「属性」は間違っている、彼らは変数であるため、それは「プロパティ」または「変数」のいずれかである必要があり、そのローカル起動/変数オブジェクトのプロパティとして記述することもできます。

> var UPPER_BOUND = 100; 
> 
> // Privileged static method. 
> this.getUPPER_BOUND() {//sic 

コードはthisウィンドウ/グローバルオブジェクトであるグローバルコンテキスト内で実行されます。したがってグローバル* getUPPER_BOUND *関数がある場合、引数なしで呼び出されます。それには中括弧({)が続き、ブロックができない場所でブロックを開くので、構文エラーです。

私は次のように意図されていたと推測:

this.getUPPER_BOUND = function() { 

コードが実行されるとRHS上の匿名関数をassigedされるグローバル/ウィンドウオブジェクトのgetUPPER_BOUNDプロパティを作成します。

>  return UPPER_BOUND; } 
> 
> ... 
> 
> // Return the constructor. 
> return function(constructorArgument) { 

これは、グローバル変数 "クラス"に割り当てられた関数です。

>  ... 
> } 
> })(); 

フィックスでは「うまくいく」かもしれませんが、エレガントではありません。コードにこのようなぎこちない誤りを持つ本は慎重に書かれておらず、出版前に適切に審査されていません。

信頼できるオンラインリソースを使用して、わからないことや間違っていると思われることについて引き続き質問してください。技術的な質問にはるかに詳細な答えを提供できるjavascriptについて議論するための他のフォーラムがあります。

5

私はこれが間違っていると思います。前述したように、 "this"はウィンドウオブジェクトを指し、コードにも構文エラーがあります。

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')); 
+0

これは特権的な静的メソッドを使って表示することを目的としていたものですが、その例はかなり間違っていました。このためのThanx。 – Zaptree

0

動作するようにこれを得たが、これは著者はそれがあることを意図したものだったかどうかわからない:次のコードは、必要な目標を達成する必要があります。

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 
+0

あなたのソリューションは、getConstantがウィンドウのプロパティになってしまう問題を回避しますが、クラスをインスタンス化する必要があります。 – Joffer

+0

これはいかがですか?直接代わりにメソッドを返しました。このようにして、クラスを最初に開始する必要はありません。 –

+0

問題は今私たちがクラスをインスタンス化できないということです。 – Joffer

0

この方法ではどうですか。

/* 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"));