Javascript 将成员函数和变量从一个对象复制到另一个对象时,内存方面会发生什么

Javascript 将成员函数和变量从一个对象复制到另一个对象时,内存方面会发生什么,javascript,Javascript,假设我们有两个对象和一个使用函数,如下所示: function using(namespace, scope){ for(x in namespace){ scope[x] = namespace[x]; } } function fooClass(){ this.foo = function(){ console.log("foo"); } this.bar = function(){ console.

假设我们有两个对象和一个使用函数,如下所示:

function using(namespace, scope){
    for(x in namespace){
        scope[x] = namespace[x];
    }
}

function fooClass(){
    this.foo = function(){
        console.log("foo");
    }

    this.bar = function(){
        console.log("bar");
    }
}

var myFoo = new fooClass();

function barClass(){
    using(myFoo, this);
}

var myBar = new barClass();
myBar.foo();
在本例中,它继承了从fooClass到barClass的所有内容。这是一个小例子,一个大范围的情况下,我正在研究这样做。我在实际用例中使用的名称空间相当大。我知道javscript通过引用传递所有对象。命名空间中的某些项是对象数组或包含对象数组或仅包含函数的单个对象。大多数原始变量都是私有的,因此它们不应该继续

我很好奇我复制了多少数据,引用了多少数据?应该引用存储在名称空间中的对象,但是函数呢?它们是像原语变量一样被复制还是被引用?更重要的是,我应该关注这个使用函数的内存消耗吗

我写它的主要原因是,有时我必须调用一个深度嵌套的对象,这使代码更可读,但如果我牺牲内存,我不想这样做。

将命名空间属性复制到空间时使用。。。在中,所有基本体和对象引用值都是重复的,因此它们占用的内存是原来的两倍

包含函数对象的JavaScript对象值保存在变量中,作为对内存中保存对象属性的某处的引用。复制操作仅复制引用,而不复制底层属性名称和值或函数代码,因此创建副本所消耗的额外内存与复制原语值类似

但是,对于所展示的用例,您可能希望扩展基本myFoo对象,以便它由barClass实例继承。当然,这确实意味着不会拍摄mFoo的快照,myBar实例将继承对myFoo的任何未来更改

ES5示例:

设myFoo={foo:foo}; 函数myBar{ 这个.bar=bar; } myBar.prototype=Object.create myFoo; myBar.constructor=myBar; let bar=新的myBar;
console.log bar.foo;函数是对象,所以引用函数的属性实际上与引用任何其他类型对象的属性没有什么不同。我想可能是这样的。让我困惑的是,当我在chromedev工具中拍摄堆快照时,有时原始名称空间会以字节为单位变大,有时新变量会变大。所以我想我可能会寻求澄清。FWIW只有指针被复制。根据解释器的不同,它可能超过4/8字节32/64位指针,但每个复制的对象仍有少量内存。实际上,它们不是按照示例复制的,而是通过指针链接的。不过,请注意,每次创建fooClass实例时,fooClass内的函数都会重新声明,并从头开始重新创建。因此,fooClass的两个实例将花费两倍的时间memory@ibrahimmahrir当然可以在我的实际用例中,fooClass的等价物只创建一次。虽然可能有多个对象在fooClass对象的名称空间上使用此using函数来澄清,但在将名称空间属性复制到空间时,请使用。。。在中,所有原语和对象引用值都是重复的,因此它们占用了两倍的内存。您的意思是,引用将占用两倍的内存,但它指向的对象/函数仍然只有一个实例?@Xandor-是的,这就是我的意思。例如,对于本教程,复制对象值将复制指向JSObject框的指针。它不会试图复制对象内的链接和值,这称为克隆对象。非常好。我认为对于我的特殊情况,默认情况下我不会扩展原始名称空间对象,而是继续使用using函数。我觉得这让使用我的系统的开发者更容易选择这两种方式。不管怎样,谢谢你提供的详细信息,这正是我想知道的。