代码之家  ›  专栏  ›  技术社区  ›  Shawn Mclean

动态创建javascript对象

  •  5
  • Shawn Mclean  · 技术社区  · 16 年前

    我肯定在jquery中看到过这样的例子。但对我来说,下面的代码不起作用。firebug调试器告诉我:“位置未定义”。你能告诉我这是否可能吗?

    function ResolveGeoCode() {
        var Location;
        Location.Ad1 = "Hello ";
        Location.Ad2 = "World";
    
        return Location;
    }
    
    var loc = ResolveGeoCode();
    var String1 = loc.Ad1; //This contains "Hello "?
    var String2 = loc.Ad2; //This contains "World"?
    

    能给我要找的这类功能起个名字吗?

    谢谢。

    7 回复  |  直到 8 年前
        1
  •  14
  •   ChaosPandion    16 年前

    这就是发生的事:

    function ResolveGeoCode() {
        // Location is declared, but its value is `undefined`, not `object`
        var Location;
        alert(typeof Location); // <- proof pudding
    
        // Failing here because you're trying to add a 
        // property to an `undefined` value
    
        Location.Ad1 = "Hello "; 
        Location.Ad2 = "World";
    
        return Location;
    }
    

    通过声明修复它 Location 在尝试向其添加属性之前,将其作为空对象文本:

    function ResolveGeoCode() {
        var Location = {};
        alert(typeof Location); // now it's an object
    
        // Programmatically add properties
        Location.Ad1 = "Hello "; 
        Location.Ad2 = "World";
    
        return Location;
    }
    

    如果提前知道属性及其对应的值,则可以使用 内联的 途径:

    function ResolveGeoCode() {
        var Location = {
            Ad1: "Hello ",
            Ad2: "World"
        };
    
        // ...further manipulations of Location here... 
    
        return Location;
    }
    

    Read here 有关对象文字的详细信息。

        2
  •  4
  •   ChaosPandion    16 年前

    这是创建内联对象的语法(在本例中是从函数返回的)。

    function ResolveGeoCode() {
        return {
            Ad1: "Hello ",
            Ad2: "World"
        };
    }
    
        3
  •  4
  •   Mic    16 年前

    在代码中尝试更改:

    var Location;
    

    在里面

    var Location = {};
    
        4
  •  2
  •   James Maroney    16 年前
    var ResolveGeoCode = {
        Ad1 : "Hello",
        Ad2 : "World"
    }
    
    var String1 = ResolveGeoCode.Ad1; //This contains "Hello "?
    var String2 = ResolveGeoCode.Ad2; //This contains "World"?
    
        5
  •  0
  •   Chuck Vose    16 年前

    这里缺少的是{}是ecmascript中动态对象的标记。所以当你看到像chaospandion这样的代码时,实际上就是这样。

    在您的示例中,您可以将单词function更改为class,这样就几乎可以得到一个完整的类了。

        6
  •  0
  •   triniMahn    16 年前

    在“resolvegocode”函数中:

    1. 执行上面描述的mic:使用空对象构造函数{}初始化变量“location”。

    2. 尝试动态添加成员,如下所示:

    location['ad1']=“你好”;
    location['ad2']=“世界”;

        7
  •  0
  •   Vijay    8 年前

    你也可以像构造器一样

    constructor{ 
    Object.assign(this)
    }
    or You can eventually pass values 
     constructor(val){ 
     Object.assign(this, val)
     }