javascript - 函数原型(prototype)对象在另一个实例上被更改

标签 javascript jquery object

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

最佳答案

jQuery.extend({}, this.defaults

正在一个新对象上设置一个名为classes的属性,并将其设置为与原始对象相同的指向数组['default']的内存指针。

换句话说,两个实例都有单独的“设置”对象,它们都有一个指向同一数组的 classes 属性。

您应该使用扩展的“深层”版本:https://api.jquery.com/jquery.extend/#jQuery-extend-deep-target-object1-objectN

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

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

关于javascript - 函数原型(prototype)对象在另一个实例上被更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45493764/

相关文章:

jquery - 设置用户格式和重定向用户(使用 jQuery UI 自动完成)

两个不同 vector 中的 C++ 相同对象

javascript - ES5 的代理替代品

javascript - 使用 Protractor 通过文本进行选择

javascript - jQuery 函数在 Promise.then() 中不可用

javascript - 如何在不删除选择框滚动条的情况下删除浏览器滚动条

javascript - PHP json_encode 到 JS 对象数组

javascript - setInterval 不适用于 MS 中的长间隔

javascript - 无法创建 SSL/TLS 安全通道

javascript - 完美的滚动条无法使用 insertAdjacentHTML 动态加载内容