2017-08-03 71 views
0

我試圖將默認對象值放入函數的原型中。但是這導致原型「默認」對象被另一個實例改變。爲什麼會發生?我知道我可以將默認對象放在函數內部,但這不是我想要做的。有人能解釋爲什麼原型變量被二次覆蓋嗎?演示是在這裏: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, ... 

這將遞歸到您的陣列和克隆太多。

相關問題