我试图将默认对象值放在函数的原型中。但这导致原型"默认"要被另一个实例更改的对象。为什么会这样?我知道我可以将默认对象放在函数中,但这不是我想要做的。有人可以解释为什么原型变量被第二个实例覆盖了吗?演示在这里: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() );
答案 0 :(得分:2)
jQuery.extend({}, this.defaults
在新对象上设置名为classes
的属性,并将其设置为与原始数组['default']
相同的内存指针。
换句话说,两个实例都有单独的“设置”对象,这两个对象都具有指向同一数组的classes
属性。
您应该使用extend的“深层”版本:https://api.jquery.com/jquery.extend/#jQuery-extend-deep-target-object1-objectN
jQuery.extend(true, {}, this.defaults, ...
会递归到你的数组中并克隆它。