我有两个对象:myObject1
和myObject2
。
我尝试使用名为myObject1
的{{1}}方法从my0bject2
调用私有变量,但increment
表示console.log
。
有没有办法直接从NaN
方法调用myObject1
变量?也许以某种方式扩展它?
myObject2
答案 0 :(得分:2)
在var x
中指定myObject1
时,您将该变量声明为私有。唯一可以访问该变量的是myObject1
中的方法。如您所述,此变量是私有的。
如果你想保密或不保密,你没有说清楚,所以我假设你只想访问它。你可以在这里做几件事。
您可以通过myObject1
将变量作为this
的对象属性附加。 this
指的是当前范围(myObject1
),因此在this.x
中myObject1
说myObject1.x
。从该函数中,您需要返回this
,以便它的实例可以访问其所有公共属性。
var myObject1 = function() {
this.x = 0;
return this;
}();
var myObject2 = function() {
return {
increment: function() {
myObject1.x +=1;
console.log(myObject1.x);
}
}
}();
myObject2.increment();

您也可以只返回所需的属性,在本例中为x
。在这种情况下,您可以更好地控制返回的内容,并获得与上面相同的结果。
var myObject1 = function() {
var x = 0;
return {
x: x,
};
}();
var myObject2 = function() {
return {
increment: function() {
myObject1.x +=1;
console.log(myObject1.x);
}
}
}();
myObject2.increment();

无论哪种方式,这些方法都会公开x
的{{1}}属性,使其公开。
答案 1 :(得分:1)
因为你必须先创建函数myObject的一个实例才能访问它的属性,
/* Create an object called myObject which can be instantiated using the new keyword */
var myObject = function() {
/* use 'this.x' to define an internal variable for x */
this.x = 0
};
/* this is where you create a new instance of myObject which will have the 'x' property */
var myObject1 = new myObject();
var myObject2 = function() {
return {
increment: function() {
myObject1.x += 1;
console.log(myObject1.x);
}
}
}();
myObject2.increment();

编辑:为代码添加了注释以解释重要的修改
答案 2 :(得分:0)
myObject1返回一个对象,其中x是它自己的属性。所以现在你正在递增对象的一个属性。早些时候,使用var x
你假设增加myObject1的属性,但事实上它只是该函数的一个局部变量,它返回你的对象,即在函数中声明var x无效。
var myObject1 = function() {
return{
x: 0
}
}();
var myObject2 = function() {
return{
increment: function() {
myObject1.x +=1;
console.log(myObject1.x);
}
}
}();
myObject2.increment();
答案 3 :(得分:0)
在javascript中,有函数作用域,你可以在该函数体中访问使用var关键字定义的任何内容。
您正在实施模块模式。您的函数在您的情况下表现为构造函数(或工厂)(返回构造的对象)。 myObject2无法访问x,因为它在另一个范围内定义,并且不包含在第一个函数生成的对象中。
您可以在返回对象中返回x变量;
var myObject1 = function() {
return{
x: 0
}
}();
这使得它成为返回对象(分配给myObject1)的属性,您可以访问它。
您应该更详细地研究“功能范围”和“模块模式”。
答案 4 :(得分:-1)
您在功能范围内定义了一个变量。相反,您应该为当前对象(this
)分配一个变量,当然还要返回该对象而不是空对象。
var myObject1 = function() {
this.x = 0;
return this;
}();