我了解到javascript始终是“按值传递”。即使在分配对象时,它也会传递值,该值是对该对象的引用。
1: var obj1 = {name: "bob"};
2: var obj2 = obj1;
3: obj2.name = "joe";
4: console.log(obj1.name); // output: "joe"
5: obj2 = {name: "ron"};
6: console.log(obj1.name); // output: "joe"
在第4行上,obj1
和obj2
都包含对同一对象的引用,并且我们能够通过两个变量来操纵该对象。但是第5行将obj2
设置为引用新对象。现在obj1
和obj2
引用了2个不同的对象。到目前为止,这一切都说得通。
我的问题是:有什么方法可以访问对象本身而不仅仅是对其的引用?这样,我们可以将其更改为一个全新的对象,而不是简单地操作该对象,现在引用该对象的任何变量都将引用该新对象?像这样的东西:
var obj1 = {name: "bob"};
var obj2 = obj1;
var actualObject = GetActualObjectReferencedBy(obj2);
actualObject = new Date();
console.log(obj1) // output: the current date;
console.log(obj2) // output: the current date;
所以actualObject
就这样。一切所指的实际对象,而不仅仅是参考。对其进行任何更改不会破坏引用。
以下是我要执行此操作的示例:
function Person(n){
this.name = n;
}
function attachProxies(){
for(var i = 0; i < arguments.length; i++){
var actualObject = GetActualObject(arguments[i]);
actualObject = new Proxy(actualObject, {
get: function(obj, prop){ return "I'm " + obj[prop]; };
});
}
}
var guy1 = new Person("bob");
var guy2 = new Person("joe");
var guy3 = new Person("rom");
attachProxies(guy1, guy2, guy3);
console.log(guy2.name); // output: "I'm joe"
我能想到的最接近的东西是
function attachProxies(obj){
return new Proxy(obj, {
get: function(obj, prop){return "I'm "+obj[prop];};
});
}
var guy1 = new Person("bob");
var guy2 = new Person("joe");
var guy3 = new Person("rom");
guy1 = attachProxies(guy1);
guy2 = attachProxies(guy2);
guy3 = attachProxies(guy3);
但这是有限且重复的。
我尝试环顾四周,但似乎找不到任何方法。如果不可能,请帮助我理解原因。
编辑:
我不认为这是重复的,因为我在设置问题中承认javascript按值传递。假定的重复项仅说明但未回答我是否有任何方式访问对象的问题。
答案 0 :(得分:1)
否,这是不可能的。您无法访问存储对象内容的内存,并用取自另一个对象的不同内容替换它们。
好吧,您可以这样做,但要有一定的限制。您可以通过简单地为其分配新值来更改对象的内容,这些内容主要是对象的属性。您甚至可以将其原型链替换为Object.setPrototypeOf
。 (假设对象没有冻结或无法配置)。
但是,您绝对不能做的是将对象替换为其他内部类型的对象,例如,将普通的普通对象转换为Date
的{{1}}实例。从根本上讲这是不可能的。
您的“最接近的事物”解决方案确实是您可以执行的最接近的事情,它涉及为存储旧参考的所有位置(在您的情况下为变量)分配新的参考值。但是,如果您的包装器函数支持语法,则可以减少重复性
Proxy