Javascript +基本对象文字范围问题

时间:2013-03-25 14:23:44

标签: javascript object-literal

我知道这是非常基本的,但为什么x在此代码块中返回undefined?有没有办法定义属性并立即使用它来设置另一个属性?

    var grid = {
        x : 75,
        y : 75,
        location : [grid.x, grid.y],                
        init : function () {
            console.log(grid.location[0]);
        }
    }

2 个答案:

答案 0 :(得分:2)

在将对象分配给变量之前,不能使用该变量来访问对象的属性。创建对象时,变量grid仍未定义。在创建对象时,您没有任何引用它。

将对象分配给变量后,您可以使用这些属性:

var grid = {
    x : 75,
    y : 75,
    init : function () {
        console.log(grid.location[0]);
    }
}

grid.location = [grid.x, grid.y];

您还可以将其包装在函数表达式中,以获取返回完整对象的代码:

var grid =
  (function(){

    var obj = {
      x : 75,
      y : 75,
      init : function () {
        console.log(grid.location[0]);
      }
    };
    obj.location = [obj.x, obj.y];

    return obj;

  })();

答案 1 :(得分:1)

  

有没有办法定义属性并立即用它来设置另一个属性?

No.但是,你可以use a getter,这对函数来说是或多或少的语法糖:

var grid = {
    x : 75,
    y : 75,
    get location() {
        return [this.x, this.y];
    },                
    init : function () {
        console.log(grid.location[0]);
    }
}

http://jsfiddle.net/mattball/erUJj

这个答案总结了各种选项:https://stackoverflow.com/a/15486618