2

Chrome のコンソールで試したこの簡単なコードを考えてみてください。

function Container() {
    var secret = 3;
    this.getSecret = function() {
        return secret;
    }
}

現在、次のコマンドを実行しても 3 を取得できません。

var c1 = new Container();
c1.secret //yields undefined

ただし、これは期待どおりに機能します

c1.getSecret() //returns 3

さて、これは私が試した風変わりなことです:

c1.secret = 10;
c1.getSecret(); //I was expecting it to return 10

ただし、3 が返されます。コンソールにオブジェクトが表示されると、次のようになります。

Container {getSecret: function, secret: 10}

c1.secret = 10 がオブジェクトの秘密のプライベート変数の値を変更しなかった理由を誰かが説明できますか? 「secret」という名前のフィールドが 2 つありますか?

最終的なオブジェクトがメモリ内で実際にどのように見えるか混乱しています。

4

1 に答える 1

4

privateは本当に紛らわしい言葉です。

使用して宣言したsecretvarvar secret = 3;は、「プライベート」変数ではありません。これは、Container コンストラクター スコープでのみ表示される変数です。getSecretまた、同じスコープでメソッドを宣言するため、メソッドにアクセスできます。

あなたがした場合:

function Container() {
    var secret = 3;
}

Container.prototype.getSecret = function() {
    return secret;
}

getSecret を呼び出すと、シークレットが未定義であることがわかります。

そして、現在のコードに次を追加します。

Container.prototype.getSecret2 = function() {
    return this.secret;
}

secret10 を返します。これは、オブジェクトが呼び出されたときに呼び出されるプロパティを持っているためです。

c1.secret = 10;

でも覚えておいて:

var secret = 3;変数を現在のオブジェクトにアタッチしません。現在のスコープに存在する変数を作成するだけです。そのスコープで宣言されたすべての関数は、それにアクセスできます。

于 2013-07-19T21:03:41.187 に答える