函数原型对象在另一个实例上更改

时间:2017-08-03 20:14:19

标签: javascript jquery object

我试图将默认对象值放在函数的原型中。但这导致原型"默认"要被另一个实例更改的对象。为什么会这样?我知道我可以将默认对象放在函数中,但这不是我想要做的。有人可以解释为什么原型变量被第二个实例覆盖了吗?演示在这里: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() );

1 个答案:

答案 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, ...

会递归到你的数组中并克隆它。