创建新的对象实例而不覆盖JavaScript中的旧实例

时间:2019-12-11 15:11:23

标签: javascript jquery

我有一个带有原型的函数,该原型同时包含带有变量/常量的对象和其他函数。这些功能之一包括初始化功能,用于设置原型内的变量/常量。当仅创建对象的一个​​实例时,这很好(出于我的目的)。但是,当创建多个实例时,旧实例将被覆盖,而不是创建纯粹的“新”对象。

通常,最好在下面的代码示例中显示/解释。

var objectTest = function () {};

objectTest.prototype = {
   _params: {
      a: ""
   },
   init: function (a){
       var self = this;
       self._params.a = a;
   }
};

var object1 = new objectTest();
object1.init("foo");
var object2 = new objectTest();
object2.init("bar")

$("#Testing").html(object1._params.a);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="Testing">Initial</div>

虽然我希望object1._params.a为“ foo”,但它却是“ bar”。如何组织/修改此代码,使object1._params.a为“ foo”,而object2._params.a为“ bar”?如果答案在使用JQuery的某个地方,我也可以访问JQuery。

1 个答案:

答案 0 :(得分:3)

问题与不变性有关。由于您在原型内部创建了_params对象,因此它将在所有实例之间共享(因为原型也在各个实例之间共享)。避免这种情况的方法是只在原型中创建函数,然后在构造函数中初始化字段。

var objectTest = function () {
    this._params = {
        a: ""
    };
};

objectTest.prototype = {
   init: function (a){
       var self = this;
       self._params.a = a;
   }
};

var object1 = new objectTest();
object1.init("foo");
var object2 = new objectTest();
object2.init("bar")

$("#Testing").html(object1._params.a);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="Testing">Initial</div>

也请尝试使用classes而不是手动弄乱原型,但是我确定您有理由; P。