Javascript属性引用和内存使用情况

时间:2016-07-05 08:29:07

标签: javascript object memory getter

我有一小段代码,将implement函数添加到Object(我知道,这不是一个好习惯)。它将参数对象(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
        });
    };
};

通过复制,它实际上创建了自己的属性,但该值是对superobject属性的引用。这是由属性“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上调用实现方法后,obj1.b真的是引用吗?我的意思是 - obj1.bobj2.b指向内存的同一部分吗?值b:20仅存在于内存中的一个位置吗? 是否有一个很好的简单工具可以查看javascript的内存使用情况来确认这一点?

0 个答案:

没有答案