无法从另一个对象调用变量

时间:2016-11-05 20:54:40

标签: javascript methods

我有两个对象:myObject1myObject2。 我尝试使用名为myObject1的{​​{1}}方法从my0bject2调用私有变量,但increment表示console.log。 有没有办法直接从NaN方法调用myObject1变量?也许以某种方式扩展它?

myObject2

5 个答案:

答案 0 :(得分:2)

var x中指定myObject1时,您将该变量声明为私有。唯一可以访问该变量的是myObject1中的方法。如您所述,此变量是私有的。

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