2017-08-03 5 views
0

関数のプロトタイプにデフォルトのオブジェクト値を配置しようとしています。しかし、それはプロトタイプの "デフォルト"オブジェクトを別のインスタンスによって変更させる原因になります。なぜそれが起こっているのですか?私はfunction内にdefaultsオブジェクトを置くことができますが、それは私がしたいことではありません。誰かがなぜプロトタイプ変数が第2のインスタンスによってオーバーライドされたのか説明できますか?デモはここにある:https://jsfiddle.net/c0zg5vjp/2/関数プロトタイプオブジェクトが別のインスタンスで変更される

window.foo = function(options) { 

    this.settings = jQuery.extend({}, this.defaults, options || {}); 

    this.bar = function() { 

     this.settings.classes.push('new_class'); 
    } 
} 

window.foo.prototype.defaults = { 'classes' : ['default'] }; 

var instance = new foo(); 

instance.bar(); 

var instance_2 = new foo(); 

instance_2.bar(); 

alert(instance_2.settings.classes.join()); 

答えて

2

jQuery.extend({}, this.defaults

は、新しいオブジェクトにclassesという名前のプロパティを設定し、オリジナルとして配列['default']に同じメモリポインタにそれを設定しています。

つまり、両方のインスタンスには、両方とも同じ配列を指すclassesプロパティを持つ別々の「設定」オブジェクトがあります。 https://api.jquery.com/jquery.extend/#jQuery-extend-deep-target-object1-objectN

jQuery.extend(true, {}, this.defaults, ... 

もあなたの配列とクローンそれに再帰ます:

あなたは延長の「深い」バージョンを使用する必要があります。

関連する問題