在Javascript中定义对象

时间:2012-03-02 08:02:53

标签: javascript object

我想在javascript中定义以下对象:

var property = 'foo';
var value = 'bar';
var obj = {
    property: value;
}; 

这将产生以下结果:

obj.property <-> 'bar';
obj.foo <-> undefined

这是正常的,但如何定义要获取的对象:

obj.foo = 'bar';

可能的解决方案是:

var obj = {};
obj[property] = value;

var obj = new Object();
obj[property] = value;

但是,当必须定义像:

这样的对象时,这是不方便的
var obj = {
    o1: {
        oo1: {
            property: value;
        }
    }
};

同样,我想要的是:

var property = 'foo';
var value = 'bar';
var obj = {
    property: value;
}; 
alert(obj.foo); // I want this to alert: 'bar'

你如何处理类似的情况? 谢谢!

4 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望在对象的构造函数中使用全局范围内的变量。除了礼貌地存在风险,因为在那里确实无法确定这些变量的价值,你可以像这样指定范围:

var property = 'foo';
var value = 'bar';
var obj = {val : window.value};//doesn't work for property id's
var obj[window.property] = obj.val;
alert(obj.foo);//alerts 'bar'

或者,让构造函数接受参数:

function Foobar(prop,val)
{
    this[prop] = val;
}
var obj = new Foobar('foo','bar');
alert(obj.foo);//alerts 'bar'

在我的第二个例子中,嵌套对象可以使用传递给它们的'parent'/ contains对象的参数,如下所示:

function Foobar(prop,val)
{
    Foobar.prop = prop;
    Foobar.val = val;
    ...
    this.subObj = {};
    this.subObj[Foobar.prop] = Foobar.val;//var prop from scope Foobar, same as window
}

利用函数或对象的变量可以变为静态的事实,你甚至可以这样做:

Foobar.prop = (typeof Foobar.prop !== 'undefined' ? Foobar.prop : prop);
//or
Foobar.subObj=  {new Foobar};//extending parent object
Foobar.subObj.newProp = 'newVal';

答案 1 :(得分:1)

在JavaScript中执行此操作的唯一方法是使用括号:

var property = 'foo',
    value = 'bar',
    obj = {};

obj[property] = value;

我不确定我理解为什么这对你来说不切实际。你能解释一下吗?

答案 2 :(得分:1)

似乎你想要一个别名。

如果我理解正确,你想这样做:

var obj = {something: 'bar'};
alert(obj.foo); // alerts 'bar'

为此,请定义一个getter。这是最简单的原型:

function Factory() {
}
Factory.prototype = {
    get foo() {
        return this.something;
    }
};

var obj = new Factory;
obj.something = 'bar';
alert(obj.foo); // alerts 'bar'

原型基本上是对象的模型。当您创建一个新Factory时,结果对象具有getter'something',它返回foo的值。这是一种混乱的语法,但它适用于你想要的。

此外,您可以完全避免原型并执行此操作:

var obj = {};
obj.__defineGetter__('foo', function () { return this.something; });
obj.something = 'bar';
alert(obj.foo); // alerts 'bar'

__defineSetter可以做同样的事情。这是ES5语法,并不适用于所有浏览器(IE),但应该适用于较新的浏览器。

有关详细信息,请参阅John Resig's blog

答案 3 :(得分:0)

我建议https://github.com/leecrossley/dotject

您可以使用以下内容制作对象:

dotject("a,b.c");

使:

{
  "a": {},
  "b": {
    "c": {}
  }
}

或更真实的例子:

var camera = {isEnabled: true};
camera = dotject("settings.encoding.format,output.data.base64", camera, "JPEG", true);

{
  "isEnabled": true,
  "settings": {
    "encoding": {
      "format": "JPEG"
    }
  },
  "output": {
    "data": {
      "base64": true
    }
  }
}