0

ここで正確に何が起こっているのかについて少し混乱しています。

この単純なコードを考えると:

stuff = (function(){
    function extendFoo(bar)
    {
        $.extend(this.foo,bar);
    }
    this.foo = {};

    return { foo : foo, extendFoo: extendFoo};
})();

この簡単な操作に続いて:

zz = Object.create(stuff);
zz.extendFoo({bar:'bar'});
vv = Object.create(stuff); //foo is still extended(??)

したがって、返されたオブジェクトフォーム Object.create に対して実行された操作は、そのオブジェクトのプロトタイプに影響を与えることに気付いたので、新しいオブジェクトを作成すると、プロトタイプが変更され、「変更された」バージョンになります。

これは多くのレベルで間違っているようです。ここで何が起こっているのか説明できる人はいますか?

この動作は、次のパターンを使用して再現することはできません:

stuff = (function(){

    function setFoo(bar)
    {
        this.foo = bar;
    }
    var foo;

    return { foo : foo, setFoo: setFoo};

})();

したがって、ここでは $.extend のせいだと思います。

どんな入力でも素晴らしいでしょう!

4

1 に答える 1

1

この問題はモジュール パターンとは関係なく、すべてプロトタイプと関係があります。

zz = Object.create(stuff) 

stuffをプロトタイプとして新しいオブジェクトを作成します。

vv = Object.create(stuff) 

stuffプロトタイプと同じオブジェクトで新しいオブジェクトを作成します。

zzvvは同じプロトタイプ オブジェクトを共有しているため、プロトタイプ オブジェクト を変更すると、派生オブジェクトとの両方stuffに変更が反映されます。プロトタイプを変更する方法が他の方法であるかどうかは関係ありません。また、派生オブジェクトを使用してプロトタイプを変更するか、プロトタイプを使用するかは関係ありません。zzvv$.extend

コードでは、fooオブジェクトは、派生オブジェクトzzおよびではなく、プロトタイプに関連付けられていますvv。が派生オブジェクトでextendFoo呼び出されると、プロトタイプが変更されるため、 への変更は派生オブジェクトで共有されます。zzfoofoo

2番目の例では、setFoo

this.foo = bar;

何が起こっているかというとfoo、派生オブジェクトにプロパティを設定しているため、プロトタイプのfoo. 派生オブジェクトで実行setFooした後、そのオブジェクトfooはプロトタイプではなくなりfooます。これは、実行することで確認できます

zz = Object.create(stuff);
console.log(zz.hasOwnProperty('foo')); // false
zz.setFoo(bar);
console.log(zz.hasOwnProperty('foo')); // true
delete zz.foo;
console.print(zz.foo); // foo is the original foo, not null
console.log(zz.hasOwnProperty('foo')); // false

fooではなく、実際には元のものが返されますnull

2 番目のケースで機能する理由setFooは、プロトタイプを変更していないためです。したがって、変更は派生オブジェクト間で共有されなくなります。原作と一緒

$.extend(this.foo,bar);

オブジェクトthis.fooをその場で変更していて、オーバーライドしていません。これは次の方法でも見ることができますhasOwnProperty

zz = Object.create(stuff);
console.log(zz.hasOwnProperty('foo')); // false
zz.extendFoo({bar:'bar'});
console.log(zz.hasOwnProperty('foo')); // false
于 2015-03-02T12:29:14.843 に答える