0

アプリの1つでRevealingModuleパターンを使用していますが、オブジェクトでinitメソッドが呼び出された後、文字列変数の値を返すのに問題があります。目標は、stringVarの値を設定し、それをUIから取得することです。arrayVarは機能します。

ありがとう、クリス

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>

<script type="text/javascript">
    var viewModel = null;
    $(document).ready(function () {
        viewModel = new ViewModel();
        viewModel.init();
        // writes "object1" to ul
        $("#log").append("<li>" + viewModel.arrayVar[0] + "</li>");
        // writes "" to ul
        $("#log").append("<li>" + viewModel.stringVar + "</li>");
    });

    ViewModel = (function () {
        var
            arrayVar = new Array(),
            stringVar = '',
            init = function () {
                // load data from external source
                arrayVar.push("object1");
                arrayVar.push("object2");
                stringVar = "string value 1";
            };
        return {
            arrayVar: arrayVar,
            stringVar: stringVar,
            init: init
        };
    });

</script>
4

2 に答える 2

0

「これ」は機能します。しゃれ意図:)

init = function () {
    // load data from external source
    this.arrayVar.push("object1");
    this.arrayVar.push("object2");
    this.stringVar = "string value 1";
};
于 2013-02-11T01:44:47.590 に答える
0

ここでの問題は、文字列が不変であるため、で再割り当てstringVarするとinit、実際には変数が新しい文字列に置き換えられ、コンストラクタから返されたオブジェクトが元の文字列を指すようになります。

これを回避する最も簡単な方法は、直接アクセスの代わりにゲッター関数を使用することです。プロパティのようなアクセスが必要な場合は、いくつかのオプションがあります。__defineGetter__非推奨のECMA5ゲッターがあり、互換性が制限されます。

// your constructor
function() {
  // ...

  var getStr = function() {
    return stringVar;
  };

  // saving the returned object to a variable, as a few of the options
  // involve operating on an object.
  var m = {
    // typical getter function
    getStr: getStr,

    // ecma5 pretty syntax getter property
    get str1() { return getStr() }
  };

  // __defineGetter__ variant
  m.__defineGetter__("str2", getStr);

  // ecma5 Object.defineProperty variant
  Object.defineProperty(m, "str3", {get: getStr, enumerable: true});

  return m;
}

// access them like:
viewModel.getStr();
viewModel.str1;
viewModel.str2;
viewModle.str3;
于 2013-02-11T18:49:38.763 に答える