4

get および set 関数を持つ単純なグローバル オブジェクトがあります。JSlint は、「use strict」に違反しているため、get および set 関数で「this」を使用することを好みません。「厳密な使用」に違反しないように、「これ」を何に置き換えますか(つまり、「これ」を使用せずに「これ」が参照しているのと同じものを参照するにはどうすればよいですか)?

function fnDirty() {
    "use strict";
    var bIsdirty = false;

    this.get_bIsdirty = function() {return bIsdirty; };
    this.set_bIsdirty = function(x) {bIsdirty = x; };
}
var GV_oDirty = new fnDirty();
4

3 に答える 3

5

慣例により、コンストラクター関数は大文字で始まります。JSLint はthis、コンストラクター関数を使用している場合に厳密モードでの使用を許可しますが、小文字で始まるため、コンストラクターとして認識されません。

function FnDirty() {
    //your code
}
于 2012-08-27T00:47:22.353 に答える
1

別のアプローチを使用できます。

var fnDirty = (function() {
  var _isDirty = false;

  return {
    get_dirty: function() { return _isDirty; },
    set_dirty: function(val) { _isDirty = value; }
  };

})();
于 2012-08-27T00:41:53.233 に答える
1

残りの質問に答えるには、「コンストラクターなしでこれを行うための回り道は何ですか?」

ブライアンの考えは正しかったのですが、彼が実際に作成していたのは、工場ではなく、個人の所有物を持つ単一のオブジェクトでした。

そのため、「クラス」の各インスタンスに固有のプライベート プロパティのコピーを付与する関数が必要な場合は、これを行うことができます (「Foo」よりも便利なものの実際のクラスを説明します)。概念をよりよく説明するために、「バー」-これを意図した用途に再構成するのは非常に簡単なはずです):

var makeWallet = function (starting_amount) {
    var amount = starting_amount,
        overdraft = 1000,
        addAmount = function (added_funds) { amount += added_funds; },
        deductAmount = function (extracted_amound) {
            if (is_sufficient_funds(amount, overdraft, extracted_amount)) {
                amount -= extracted_amount;
                return makeWallet(extracted_amount);
            }
        },
        // other needed public/helper methods here...
        // checkBalance(), is_sufficient_funds(), etc...
        public_interface = {
            // add all public-API methods you need here
            addFunds : addAmount,
            deductFunds : deductAmount
        };

     return public_interface;
};

これで、オブジェクトを返す関数ができました。各オブジェクトには、そのオブジェクト固有の「プライベート」(クローズドオーバー)amount変数にアクセスするメソッドがあります。この変数は、それらのメソッドに固有であり、それらのメソッドのみがアクセスできます。

関数をプライベート スコープで vars としてビルドするか、プライベート スコープで関数宣言としてビルドするか、直接 a に配置するかreturn { func1 : () {...},... };は、関数が呼び出されたときにその関数の内部で定義されている限り (つまり: ではない)、無関係です。プロトタイプ チェーン (このパターンでは使用できません) では、この関数をnewで呼び出しません)。

さて、それですべて順調です。これで、機能するウォレット メーカーができました (セキュリティ機能とユーザー機能がなくても、ヤダヤダ... ...宿題です)。

しかし、そこにPRIVATE STATICメンバーを追加したい場合はどうでしょうか? 人々に銀行カードを発行できるように、シリアルキーを追跡する必要があるとしたら? または、支店番号を追跡する必要がありましたか? ここで、ブライアンの IIFE の出番です。ただし、完成したウォレット オブジェクトを返す代わりに、ウォレット FACTORYを返します。

var makeWallet = (function () {
    var serial_num = 0,
        branch_num = "A011002z";
    function walletMaker = function (starting_amount) {
        /*same function as before, except that you ALSO call:
          serial_num += 1; in the construction of the wallet, and assign the id */
        var id = serial_num += 1;
        return wallet;
     }

     // then you return the wallet-factory
     // which becomes the new value of the outer function
     return walletMaker; 
}());

これで、静的プロパティ (最も外側のクロージャーで、ウォレット ファクトリが「静的」メンバーとして永続的にアクセスできるようになります) を取得し、インスタンスベースのプライベート メンバーを取得しました。これは内部メソッドの作成中に追加されました。インスタンスオブジェクトに完全にアクセスできます。

これに対する唯一の欠点は次のとおりです。

  1. コンストラクターを使用していないため、この特定のクラスのプロトタイプ機能を失います。うーん。あなたのオブジェクトがこの設定を必要とするなら、それを持たない方が良いでしょう...
    ...もしそうでなく、public-everything がクールなら、コンストラクタとプロトタイプを使用するか、インライン オブジェクトを構築します。メソッド、および同様に構築された各オブジェクトで動作するサービス (関数) を構築します。

  2. すべてのオブジェクトをこの方法で構築すると、(プライベート参照を囲むために) それぞれ独自の関数のコピーを持つこれらのオブジェクトを何千、または何万も作成すると、メモリのペナルティが発生します。繰り返しますが、これは機能に対して支払う価格です。セキュリティ/クリーンなインターフェイスが必要な場所ではメモリ ヒットを取り、必要のない場所ではメモリ ヒットを取りません。

言うまでもありませんが、金融機関ではこれを使用しないでください。クライアント向けのコードは、実際のお金を追加および削除する機能を信頼するのに最適な場所ではありません...

問題が解決することを願っています。

于 2012-08-27T05:43:30.170 に答える