Javascript属性引用和内存使用

Javascript属性引用和内存使用,javascript,object,memory,getter,Javascript,Object,Memory,Getter,我有一小段代码,它将实现函数添加到对象(我知道,这不是一个好的做法)。它将参数对象(superobject)的属性复制到对象中,您可以在该对象上调用该方法 Object.prototype.implement = function(superobject) { var props = {}; for (var key in superobject){ if (superobject.hasOwnProperty(key) && !this.hasO

我有一小段代码,它将
实现
函数添加到
对象
(我知道,这不是一个好的做法)。它将参数对象(superobject)的属性复制到对象中,您可以在该对象上调用该方法

Object.prototype.implement = function(superobject) {
    var props = {};
    for (var key in superobject){
        if (superobject.hasOwnProperty(key) && !this.hasOwnProperty(key)) 
            props[key] = {
                enumerable: true,
                configurable: true,
                get: this.implement.__get__(superobject, key),
                set: this.implement.__set__(key)
            };
        }
    Object.defineProperties(this, props);
    return this;
};

Object.prototype.implement.__get__ = function(superobject, key){
    return function(){return superobject[key];};
};

Object.prototype.implement.__set__ = function(key){
    return function(value){
        Object.defineProperty(this, key, {
            value: value,
            writable: true,
            configurable: true,
            enumerable: true
        });
    };
};
通过复制,它实际上创建了自己的属性,但该值是对超级对象属性的引用。这是由属性“getter”完成的。此示例显示了一个简单的用法:

var obj1 = {
    a:10
}

var obj2 = {
    b:20
}

obj1.implement(obj2)  // "implement" properties of obj2 to obj1

console.log(obj1.a) // -> 10
console.log(obj1.b) // -> 20

obj2.b = 21

console.log(obj1.a) // -> 10
console.log(obj1.b) // -> 21 -> it apperas to be reference to property b in obj2

obj1.hasOwnProperty("a") // -> true
obj1.hasOwnProperty("b") // -> true

obj1.b = 30;

console.log(obj1.b) // -> 30 //since obj1 has now "truly own" property b, it uses value of that instead of obj2's.
console.log(obj2.b) // -> 20
我的问题是。我在
obj1
上调用implementmethod之后,
obj1.b
真的是一个参考吗?我的意思是,
obj1.b
obj2.b
是否指向内存的同一部分?值
b:20
是否仅存在于内存中的一个位置?
是否有一个好的简单工具可以查看javascript的内存使用情况以确认这一点?

尝试将obj1.b和obj2.b与===进行比较,如果为真,则它们是相同的。请注意,有各种javascript引擎具有不同的实现。Ecmascript 5/6没有指定每一个细节。这也适用于内存管理。请尝试将obj1.b和obj2.b与===进行比较,如果为true,则它们是相同的。请注意,存在具有不同实现的各种Javascript引擎。Ecmascript 5/6没有指定每个细节。这也适用于内存管理。