如何使原型中的对象不在javascript中共享
为了节省时间,我尝试通过添加属性来动态生成原型。我希望只生成一次原型,因为生成过程非常耗时,然后将此原型用于另一个对象如何使原型中的对象不在javascript中共享,javascript,prototype,Javascript,Prototype,为了节省时间,我尝试通过添加属性来动态生成原型。我希望只生成一次原型,因为生成过程非常耗时,然后将此原型用于另一个对象 // Generated prototype var PROTO = { a: "a", b: "b", data : { // Object dynamically added through time-consuming function c: "c", d: "d" } } function OBJ() {
// Generated prototype
var PROTO = {
a: "a",
b: "b",
data : { // Object dynamically added through time-consuming function
c: "c",
d: "d"
}
}
function OBJ() {}
OBJ.prototype = PROTO;
var obj1 = new OBJ();
var obj2 = new OBJ();
PRINT1();
obj1.a = "non a";
obj1.data.c = "non c";
PRINT2();
在打印1时,输出为
obj1: (a, b, c, d), obj2: (a, b, c, d)
obj1: (non a, b, non c, d), obj2: (a, b, non c, d)
在打印2时,输出为
obj1: (a, b, c, d), obj2: (a, b, c, d)
obj1: (non a, b, non c, d), obj2: (a, b, non c, d)
我知道obj1和obj2共享对数据对象的相同引用,但这不是原型在概念中的工作方式
我也试过这样做,但没有成功
function PROTO () { ... }
[...]
OBJ.prototype = new PROTO();
如何从生成的原型中获取具有相同内部结构的对象?您需要为每个实例创建自己的子对象,这是无法避免的。使用
Object.create
时,必须手动执行,如果使用构造函数,则可以在那里执行:
function OBJ() {
this.data = Object.create(PROTO.data);
}
OBJ.prototype = PROTO;
new OBJ().data === new OBJ().data // false
这就是对象引用和原型的工作原理 您可以想象,如果在当前对象上找不到访问的属性,那么原型继承就像对象是具有回退到原型的代理一样 每个实例都引用相同的原型对象 因此,如果访问obj.data,则访问(一个且唯一的)原型对象上的数据对象,从而为每个实例更改它。这有时可能是您想要的,大多数情况下不是,但它与其他所有对象引用一致
但我认为您试图修复错误的问题(XY问题)。与其关心使用原型可以形成多少纳秒的形状,不如更好地输入元素池,以避免创建、删除和垃圾收集的任务。看看Object.create(),它将在每个
OBJ
实例之间链接prototype
,这不是我想要的。如果您指定obj.data.c,它将不会覆盖原型中的c,但会创建它自己的属性。更确切地说,在哪里使用它?它的可能副本在对象表示法为PROTO
时对我有效,谢谢!