Javascript、jQuery.extend 和 "new"

标签 javascript jquery oop prototype

我在使用 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/

相关文章:

javascript - 使用 SweetAlert2 作为页面加载时的弹出窗口

javascript - jQuery addClass 单击并在再次单击时删除类

python - 如何使用继承在python中定义父对象?

swift - Swift 中的 Getters 和 Setters - 改用 WillSet 和 DidSet 是否有意义?

jquery - 如何使用用户定义的函数进行 jquery 链接

c++ - 在 C++ 中如何控制对对象的访问?

javascript - Cygwin 如何用于 python 编程?

javascript - 在django模板中单击按钮时播放音频

javascript - 扩展图像网格问题

javascript - 从下拉列表中选择数据时从 MYSQL 数据库设置输入字段值属性