Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使原型中的对象不在javascript中共享_Javascript_Prototype - Fatal编程技术网

如何使原型中的对象不在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
时对我有效,谢谢!