2010-06-01 49 views
1

如果我定义两个对象myDataStore和myDrawer是这样的:这是一种在JavaScript中引用对象的安全方法吗?

var myDataStore = function(myObjectRef) { 
    this.myInternalObject = myObjectRef; 
}; 

var myDrawer = function(myObjRef) { 
    this.myInternalObject = myObjectRef; 
}; 

如果我是创建了以下这样一个对象:

[编辑 - 调整对象的创建,以确保“这个”被映射到myObject的,而不是全局的window对象]

(function(){ 
    var myObject = window.myObject = function(){ 
     this.dataStore = new myDataStore(this); 
     this.drawer = new myDrawer(this); 
    } 
})(); 

然后myObject.dataStore.myInternalObject和myObject.drawer.myInternalObject,只会是指针回到原来的“myObject的” - 不占用任何ADDIT浏览器中的离子记忆。是?

我有兴趣实现这样的技术 - 因为它可以让对象更容易相互通信。

+0

对不起,我真的不应该犯了那个错误的我是如何创建myObject的 - 我的困惑是不处理的“本”的范围,但使用JavaScript是否是要在myObject.dataStore和myObject.drawer中创建一个额外的myObject副本,还是仅仅是对myObject对象的引用 - 这是我认为它的作用 – John 2010-06-01 15:13:54

回答

1

是的,你的假设是正确的。 myInternalObject将是一个参考,而不是一个新的对象。你可以像这样的测试:

var MyDataStore = function(myObjectRef) { 
    this.myInternalObject = myObjectRef; 
}; 

var data = { 
    value: "value" 
}; 
var dataStore = new MyDataStore(data); 
data.value = "test"; 
console.log(dataStore.myInternalObject); // logs { value : "test" } instead of { value: "value" } 
1

myObject.dataStore.myInternalObjectmyObject.drawer.myInternalObject都将指向全局对象(在浏览器映射到window),除非你是一个函数内已经在声明myObject。换句话说,它将设置为this在您声明myObject的上下文中。它本身不会是myObject

+0

啊当然,让我修改代码示例更准确地解决我的问题。 – John 2010-06-01 15:08:23

2

没有。 this指的是.的左手边,或者.的左手边没有,那么它就是全局对象。

所以,如果你这样做:

var MyObj = { 
    "create": function() { 
     var myObject = { 
     dataStore = new myDataStore(this); 
     drawer = new myDrawer(this); 
     }; 
    } 
}; 
MyObj.create(); 

thisMyObj。如果你这样做:

var myObject = { 
    dataStore = new myDataStore(this); 
    drawer = new myDrawer(this); 
}; 

(不是函数)thiswindow(假设这是在浏览器中)。