2016-11-05 55 views
0

我有2个对象:myObject1myObject2。 我想从myObject1使用my0bject2方法调用一个私有变量increment,但console.logNaN。 有没有办法直接从myObject2方法调用myObject1变量?可能以某种方式扩展它?无法从另一个对象调用变量

var myObject1 = function() { 

    var x = 0; 

    return{} 
}(); 

var myObject2 = function() { 

    return{ 
    increment: function() { 
     myObject1.x +=1; 
     console.log(myObject1.x); 
    } 
    } 
}(); 

myObject2.increment(); 
+4

'回报{X:0};'从对象1 – zerkms

+1

只是这种替换VAR - >'this.x = 0' – Keith

+0

@zerkms添加的答案,请我之前做:P –

回答

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(); 
+0

Downvote对代码没有任何解释。 –

+0

@CarlMarkham更新。 – mehulmpt

-1

您正在定义函数范围内的变量。相反,您应该为当前对象分配一个变量(this),当然返回该对象而不是空对象。

var myObject1 = function() { 
    this.x = 0; 
    return this; 
}(); 
+1

对于严格模式,它不起作用,对于非严格模式,它会损坏全局对象。 – zerkms

+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();

编辑:添加了注释的代码解释重要的修改

0

在JavaScript中,有功能在范围上,那就是你在var关键字中定义的任何东西都可以在该函数体中访问。

在这里你正在实现模块模式。你的函数在你的情况下表现为构造函数(或工厂)(返回构造的对象)。 myObject2无法访问x,因为它在另一个作用域中定义,并且它不包含在由第一个函数生成的对象中。

您可以返回返回对象中的x变量;

var myObject1 = function() { 
    return{ 
     x: 0 
    } 
}(); 

这使它成为返回对象(即分配给myObject1)的属性,您可以访问它。

您应该更详细地学习“功能范围”和“模块模式”。

2

当您在myObject1内指定var x时,您声明该变量为私有。唯一可以访问该变量的方法是myObject1中的方法。如你所述,这个变量是私人的。

你没有说清楚,如果你想保持私人或没有,所以我会假设你只是想访问它。你可以在这里做几件事情。 您可以通过this将该变量附加为myObject1的对象属性。 this指的是当前范围(myObject1),所以通过在myObject1之内说this.x您可以说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();

无论哪种方式,这些方法都暴露出myObject1x财产进行公开。

+0

谨慎解释downvote? –

+0

与Aer0的答案类似,您将返回这是全局对象,并将x添加到全局范围。 –

相关问题