原型:为什么修改" child"对象实例也修改了#34; parent"对象实例?

时间:2017-01-06 01:15:27

标签: javascript inheritance data-structures graph prototype

我试图在Javascript中编写实现图形(数据结构)。为此,我有一个名为Graph的函数,它将此矩阵存储在名为this.adjMatrix的属性的2D数组中。它还有一堆方法。

我还希望创建一个称为残差图的东西,它采用Graph个对象,为自己创建this.adjMatrix的副本,并修改此副本,并将其保存在其中拥有this.adjMatrix属性。

现在,我希望残差图也可以访问所有Graph函数,因此我将Graph作为ResidualGraph的原型。然而,这带来了一个问题。以下是我的实现:

function ResidualGraph(G) {

    this.adjMatrix = G.adjMatrix.slice(); 
    this.idList = G.idList.slice();

    this.init = function() {
        for (i = 0; i < this.adjMatrix.length; i++) {
            for (j = 0; j < this.adjMatrix[i].length; j++) {
                if (i != j && G.adjMatrix[i][j] != -Infinity && G.adjMatrix[i][j] != 0) {
                    this.adjMatrix[j][i] = 0;
                };
            };
        };
    };
    this.init();
};

ResidualGraph.prototype = new Graph();
G = new Graph();
R = new ResidualGraph();

运行init()方法时(创建ResidualGraph实例时)ResidualGraph的实例根据需要修改了this.adjMatrix。但是,中传递的Graph实例由于某种原因而修改了this.adjMatrix。为什么会这样?

1 个答案:

答案 0 :(得分:0)

事实证明问题不在于原型!事实上,.slice()只创建一个浅拷贝。因此,this.adjMatrix中的ResidualGraphthis.adjMatrix中的Graph