【问题标题】:JavaScript dynamic object scopeJavaScript 动态对象范围
【发布时间】:2024-01-19 11:43:01
【问题描述】:

是否可以在另一个范围内使用创建的对象?

var iZ = 0;
var pcs = {};
function Pc(_name, _os) //Constructor 
{            
   this.name = _name; // Pc Name
   this.os = _os;    //Pc Os
   this.ausgabe = function()  
   {
   //Do something
   }; iZ++;
}
//Creating a new object 
document.getElementById("pc_create").addEventListener("click", function()
{   
      pcs['pc' + iZ] = new Pc('Pc '+ iZ , os);
      pcs['pc' + iZ].ausgabe();    
});
//Using object in another scope
document.getElementById("run").addEventListener("click", function()
{
      pcs['pc' + iZ].name = "test"; // Doesnt work 
});   

还有其他方法可以解决这个问题吗?

【问题讨论】:

  • 看到 iZ 在 onclick 中被递增和引用让我想知道这是否真的是问题。
  • 嘿,你完全改变了你的代码! o_0

标签: javascript jquery html object scope


【解决方案1】:

使用,

this.name = _name;

而不是,

var name = _name;

如果您不将name 分配给当前对象,那么该构造函数将变为local variable。这也适用于os

另外主要的错误是,每当您创建一个instance 时,您都会通过增加它的count 来更新一个variable。因此,如果您创建了 2 个实例,那么您的 2 个对象将分别存储为 'pc0''pc1'。但是计数iZ 将是2。现在,如果您当时访问'pc2',它将不会被获取,因为它没有被创建。所以你可以通过重写你的代码来修复它,如下所示,

 pcs['pc' + (iZ-1)].name = "test";

【讨论】:

  • 另外指出}); iZ++是错误的,因为那里有一个额外的大括号。
  • @gurvinder372 这是 OP 的错字。现在就检查他的问题。好像是他自己改的。
【解决方案2】:

现在可以了:

document.getElementById("run").addEventListener("click", function()
{
      pcs['pc' + iZ].name = "test"; // Now work 
});   

【讨论】:

  • 如果你减少它,那么在创建新实例时,已经存在的实例将被替换。