我有一小段代码,将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.b
和obj2.b
指向内存的同一部分吗?值b:20
仅存在于内存中的一个位置吗?
是否有一个很好的简单工具可以查看javascript的内存使用情况来确认这一点?