我有一个带有原型的函数,该原型同时包含带有变量/常量的对象和其他函数。这些功能之一包括初始化功能,用于设置原型内的变量/常量。当仅创建对象的一个实例时,这很好(出于我的目的)。但是,当创建多个实例时,旧实例将被覆盖,而不是创建纯粹的“新”对象。
通常,最好在下面的代码示例中显示/解释。
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。
答案 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。