1

セッターを使ってクロージャー変数を変更できると思ったのですが、変数に直接アクセスすると変更されません。ゲッターを使用してアクセスした場合にのみ、期待される再割り当てされた変数を取得します。別のスコープで作成されている 2 番目の変数はありますか? ここで何が起きてるの?

var obj = (function () {
  var name = "one";
  var setName = function(strName) {
    name = strName;
  };
  var getName = function() {
    return name;
  };

  return {
    name: name,
    setName: setName,
    getName: getName
  };
}());

obj.setName("two");

alert("obj.name is: " + obj.name); // Prints "one", but why not "two"?
alert("obj.getName() is: " + obj.getName()); // Prints "two" as I'd expect.

上記の例をフィドルに追加しました

4

5 に答える 5

4

Object.definePropertyを使用して、やろうとしていることを達成できます。

var obj = function () {
    var name = "one";
    var setName = function(strName) {
        name = strName;
    };
    var getName = function() {
        return name;
    };

    var result = {
        setName: setName,
        getName: getName
    };

    Object.defineProperty(result, 'name', { get: getName });

    return result;
}();

obj.setName("two");

alert("obj.name is: " + obj.name); // two
alert("obj.getName() is: " + obj.getName()); // two

更新された jsfiddle は次のとおりです: http://jsfiddle.net/potatosalad/8CsZ2/1/

于 2013-05-02T03:52:03.177 に答える