如何使原型中的对象不在javascript中共享

时间:2016-02-02 13:59:56

标签: javascript prototype

我试图通过添加属性来动态生成原型以节省时间。我的愿望是只生成一次原型,因为生成过程非常耗时,然后将此原型用于另一个对象。

// 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();

PRINT1 时,输出为

obj1: (a, b, c, d), obj2: (a, b, c, d)

PRINT2 输出

obj1: (non a, b, non c, d), obj2: (a, b, non c, d)

我知道obj1和obj2都与 data 对象共享相同的引用,但它并不是原型在概念中应该如何工作......

我也尝试过这种方式,但它没有用。

function PROTO () { ... }

[...]

OBJ.prototype = new PROTO();

如何从生成的原型中获取具有相同内部结构的对象?

2 个答案:

答案 0 :(得分:1)

您需要为每个实例创建一个自己的子对象,没有办法解决这个问题。使用android:isScrollContainer="true" 时,您必须手动执行此操作,如果您使用构造函数,则可以在那里执行:

Object.create

答案 1 :(得分:1)

确切地说,对象引用和原型是如何工作的。

如果在当前对象上找不到被访问的属性,你可以想象原型继承,比如对象是一个代理,并且回退到原型。

每个实例都引用相同的原型对象。

因此,如果访问obj.data,则访问(唯一的)prototype-object上的data-object,从而为每个实例更改它。这有时可能是你想要的,大部分时间都不是,但它与其他所有对象引用都是一致的。

但我认为你试图解决错误的问题(XY问题)。你可以通过使用原型来控制你可以塑造多少纳秒,而不是更好地补充池,以避免创建,删除和垃圾收集的任务。