gpt4 book ai didi

Javascript、jQuery.extend 和 "new"

转载 作者:行者123 更新时间:2023-11-30 13:35:38 24 4
gpt4 key购买 nike

我在使用 jQuery.extend 扩展一个对象的原型(prototype)时有一个奇怪的行为。

假设这个样本类:

var SampleClass = function (anArray) { this.Init(anArray); };

$.extend(SampleClass.prototype, {

array: null,
collection: new Array(),

Init: function (arr) {
var c = this;
c.array = arr;
c.insertInCollection();
},

insertInCollection: function () {

var c = this;
var l = c.array.length;
for (var i = 0; i < l; i++) {
var bar = {};
c.collection.push(bar);
}

alert(c.collection.length);
}
});

然后我执行这个示例代码

var arr1 = [{ name: 'foo', value: 20 }, { name: 'baz', value: 20}];
var arr2 = [{ name: 'bar', value: 60 }, { name: 'gaz', value: 40}];

c = new SampleClass(arr1);
d = new SampleClass(arr2); //<-- HERE LIES THE PROBLEM

当我创建对象“c”时,集合被填充到“insertInCollection”函数中,并且警报返回长度为 2。但是,当我实例化对象“d”(执行新的 TestClass(arr2))时,“insertInCollection”函数内的警报被触发并且警报显示 4!

实际上,我无法了解后台发生的情况。似乎第一个集合的元素从未被删除 - 当创建第二个对象(“d”)时,它已经在“集合”属性中存在对象“c”的 2 个元素。

这也会在不使用 jQuery.extend 的情况下发生,使用普通的 .prototype 方法。

谁能帮我解决这个问题?

提前致谢!

最佳答案

这是因为 SampleClass 的每个“实例”都共享一个 collection 属性:当 insertInCollection() 方法访问对象的 collection 属性,在对象本身没有找到,所以它使用对象原型(prototype)的 collection 属性。要解决此问题,您需要为每个 SampleClass 对象创建一个新的 collection 数组。 Init() 方法是执行此操作的好地方:

Init: function (arr) {
var c = this;
c.collection = [];
c.array = arr;
c.insertInCollection();
},

关于Javascript、jQuery.extend 和 "new",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5015305/

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