2017-01-17 13 views
0

私はJavascriptモジュールのパターンについてthis記事を読んで、あなたはモジュールのファイル間でプライベート変数/関数を維持し、互いからそれらにアクセスすることができます主張スニペットに出くわしたんだ:Javascriptモジュールパターンでプライベート関数/変数を使用するにはどうすればよいですか?

var MODULE = (function (my) { 
    var _private = my._private = my._private || {}, 
     _seal = my._seal = my._seal || function() { 
      delete my._private; 
      delete my._seal; 
      delete my._unseal; 
     }, 
     _unseal = my._unseal = my._unseal || function() { 
      my._private = _private; 
      my._seal = _seal; 
      my._unseal = _unseal; 
     }; 

     // permanent access to _private, _seal, and _unseal 

    return my; 
}(MODULE || {})); 

私は少し混乱していますどのように私がこれを実装するかについては、しかし、私はその混乱の大部分は、これがどのように動作するかを理解していないからだと思います。すでにロードされている他のスクリプトがこれらの内部値を利用するにはどうすればよいですか?そして、この「プライベート」空間内に関数と変数を追加するにはどうすればよいですか?

私の最終目標は、サブモジュールでオーバーライドする必要があるが、依然としてベースモジュールのファイルで参照される必要がある、ある種の「抽象的な」関数変数を提供することです。確かに私はこれほど多くはプレイしていないが、それは主に実際の実装がどのように動作するかを頭に入れているからだ。

私は、次のようなものを考えていたが、それは内部の機能にアクセスすることができないように動作するようには思えない。

// Preserve state of private variables/functions across modules 
    var _private = my._private = my._private || {}, 
     _seal = my._seal = my._seal || function() { 
      delete my._private; 
      delete my._seal; 
      delete my._unseal; 
     }, 
     _unseal = my._unseal = my._unseal || function() { 
      my._private = _private; 
      my._seal = _seal; 
      my._unseal = _unseal; 
     }; 

    my._private._unseal(); 

    my._private.bindEvents = function() { 
     alert("This function should be re-declared in your sub-module."); 
    }; 

    my._private._seal(); 

感謝を事前に。

答えて

0

私の最終目標は、 はサブモジュールでオーバーライドする必要がありますが、それでも ベースモジュールのファイルで参照が必要なことを「抽象的」関数の変数のようなものを提供することです。確かに私はこれほど多くのことをしていませんが、実際には の実装がどのように動作するかを頭に入れようとしているので、ほとんどは です。

まず、前に進んでください。 JavaScriptは従来のオブジェクト指向プログラミング言語ではありません。それは定義されていた場合

JavaScriptで

、あなたがにしたい場合は、何かを、あなたはこれを行うだろう:プライベートの事やJavaScript、あなたはネットの周りに見つけることができ、すべての任意の可視性のよう

// Look at entire prototype chain for a function 
if("doStuff" in obj) { 
    obj.doStuff(); 
} 

// Or just check if the own object has the whole function 
if(obj.hasOwnProperty("doStuff")) { 
    obj.doStuff(); 
} 

を現在のところJavaScriptにはアクセス修飾子がないため、トリックです。

はとにかく、あなたのサンプルは、通常exportsと呼ばれるmy_seal_privateプロパティを追加し、これらのトップレベルのプロパティに設定されたオブジェクトへの追加プロパティがプライベートまたは慣例によって封止されていることを定義します。つまり、これは単なる慣習です:オブジェクトの一部であるこのようなプロパティにアクセスしないで、モジュールの外側から_privateに設定してください...

ここで私の2セントはあなたがこれを避けてJavaScript となり、アクセス修飾子がないという事実を処理します。

ECMA-Script 2015以降では、プロパティ名がsymbolsという固有の識別子であるプロパティを宣言する新しい方法が定義されています。あなたはシンボルを所有していない場合は、全体のプロパティにアクセスすることはできません。

let sampleSymbol = Symbol("sample symbol"); 
let sampleSymbol2 = Symbol("sample symbol 2"); 

var obj = { 
    // Defines the property with a symbol during object 
    // declaration 
    [sampleSymbol]: "hello world" 
}; 

// Defines the property using regular property declaration syntax 
// once the object has been already built 
obj[sampleSymbol2] = "goodbye!"; 

は今モジュールパターンを使用して、このオブジェクトをエクスポートして、他のモジュールは、簡単に全体のプロパティにアクセスすることはできませんプロパティアクセスをシミュレートするためにうまくいきます。private修飾子。

最悪の部分は、あなたがまだObject.getOwnPropertySymbols機能を使用して、指定されたオブジェクトのシンボルを取得することができますが、シンボルはArray.prototype.forEach(...)for..inObject.keys(...)、またはfor..ofのようなイテレータの一部ではないので、あなたはそれのために行く必要があります。

関連する問題