4

コードはここで遊ぶことができます - http://jsfiddle.net/dsjbirch/zgweW/14/

これは基本的に、クロックフォードのプライベート変数の説明をそのままコピーして貼り付けたものです。

Object.create()少しトレースを追加しました。

2 番目のオブジェクトが最初のオブジェクトのプライベート メンバーを共有するのはなぜですか? この状況を回避しながら使用を続けるにはどうすればよいですかObject.create()

function Container(param) {

    function dec() {
        if (secret > 0) {
            secret -= 1;
            return true;
        } else {
            return false;
        }
    }

    this.member = param;
    var secret = 3;
    var that = this;

    this.service = function () {
        return dec() ? that.member : null;
    };
}

var first = new Container("private");

var second = Object.create(first);

document.write(first.service() + "<br/>");
document.write(first.service() + "<br/>");
document.write(first.service() + "<br/>");
document.write(first.service() + "<br/>");

document.write(second.service() + "<br/>");
document.write(second.service() + "<br/>");
document.write(second.service() + "<br/>");
document.write(second.service() + "<br/>");

http://jsfiddle.net/dsjbirch/zgweW/14/

私は見ることを期待します

private
private
private
null

private
private
private
null

しかし、実際には 2 番目のオブジェクトの出力はすべて null です。

private
private
private
null

null
null
null
null

そのため、オブジェクトのメンバーsecondを共有していると結論付けています。firstsecret

4

3 に答える 3

2

Object.create()new、さまざまな目的で使用されます。

既存のオブジェクトからtoを使用Object.create()します。オブジェクトの新規作成に 使用する場所。inherit
newinstance

詳細については、次の質問と回答を参照してください。

Object.create() と new SomeFunction() の違いを理解する

「new」の代わりに「Object.create」を使用する

于 2012-06-28T01:09:22.180 に答える
1

Object.create()コンストラクターを実行しません。しかし、あなたの例では、コンストラクターはプライベートマジックが発生する場所です。代わりに、Object.create()単純に新しいオブジェクトを作成し、プロパティをコピーします。

そのため、コンストラクターがスコープを作成し、そのスコープで作成された関数がコピーされるため共有されます。インスタンスが複製されると、そのスコープへのアクセスも複製されます。

于 2012-06-28T01:12:53.127 に答える