gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:16:55 24 4
gpt4 key购买 nike

我试图将默认对象值放入函数的原型(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com