0

JavaScript に関する Mozilla のチュートリアルでこれに遭遇しましたが、理解できないようです。多くのスタックオーバーフローの質問を読みましたが、質問に対する答えが見つかりませんでした。以下にコード スニペットを示します。

var createPet = function(name) {
  var sex;

  return {
    setName: function(newName) {
      name = newName;
    },

    getName: function() {
      return name;
    },

    getSex: function() {
      return sex;
    },

    setSex: function(newSex) {
      if(typeof newSex == "string" && (newSex.toLowerCase() == "male" || newSex.toLowerCase() == "female")) {
        sex = newSex;
      }
    }
  }
}

var pet = createPet("Vivie");
var pet2 = createPet("Sam");
pet.getName();                  // Vivie
pet2.getName();                 // Sam

createPet関数オブジェクトのマップを返すように見えますが、変数についてはnameどこにも言及されていませんが、どういうわけか、という名前のメンバー変数と、などのメンバー関数の束を持つクラスのオブジェクトのようpetに動作します。これはどのように機能しますか?pet2namegetName()setName()

4

2 に答える 2

3

name関数への引数createPet()です。ローカル変数sexと同じように機能し、内部で宣言された関数にのみアクセスできるプライベート メンバー変数として動作しますcreatePet()nameは に渡されcreatePet()ますが、内部から設定することもでき、返されたオブジェクト内の関数によって作成されたクロージャにより、すべて引数への参照を持っているためcreatePet()、 の実行後も存続します。createPet()name

于 2012-08-25T06:34:25.340 に答える
0

はのnameような仮パラメータとして定義されますfunction( name /*<-- there it is */)

だから考えてください:

= function( name ) {
    var sex;
};

として:

= function() {
    var name = arguments[0];
    var sex;
}

実際、それらは正確に、または少なくとも効果的には同じです。

はい、createPetプロミスキャス クロージャのダム マップを返します。実際、これを実行して、まだ機能していることを確認できます。

var a = createPet("Vivie");

var asd = a.setName;

asd("asd");

a.getName() //"asd"

これは、オブジェクトがほとんど無関係であるためです。オブジェクトではなく、データを運ぶ関数です。オブジェクトは関数 (クロージャー) のただのダム マップです。

オブジェクトのプロパティではなく、変数も扱います。また、変数が実際には変数ではなく、グローバル オブジェクトのプロパティであるグローバル変数でない限り、変数をオブジェクト プロパティのふりをすることはできません。

  • プロパティの列挙、動的アクセス、削除、定数化が可能
  • オブジェクトへの参照がある限り、どこからでもプロパティにアクセスできます

その上、モデル全体が後退しています。動作を運ぶデータではなく、データを運ぶ動作があります。

もちろん、これを行う必要はまったくありません。 https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Details_of_the_Object_Modelを参照してください。

于 2012-08-25T07:23:07.620 に答える