在 Javascript 中定义对象
Defining objects in Javascript
我想在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'
你如何处理类似的情况?谢谢!
如果我理解正确,您希望在对象的构造函数中使用全局范围内的变量。除此之外,礼貌地说是有风险的,因为实际上不可能确定这些变量的值,您可以像这样指定范围:
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'
在我的第二个示例中,嵌套对象可以使用传递给其"父"/包含对象的参数,如下所示:
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';
在 JavaScript 中执行此操作的唯一方法是使用括号:
var property = 'foo',
value = 'bar',
obj = {};
obj[property] = value;
我不确定我是否理解为什么这对你来说是不切实际的。您能稍微解释一下吗?
看来你想要一个别名。
如果我理解正确,您想这样做:
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'
原型基本上是对象的模型。当你创建一个新的工厂时,结果对象具有返回foo值的getter'something'。 这是一种混乱的语法,但它适用于您想要的。
此外,您可以完全避免原型并执行以下操作:
var obj = {};
obj.__defineGetter__('foo', function () { return this.something; });
obj.something = 'bar';
alert(obj.foo); // alerts 'bar'
同样的事情也可以用__defineSetter
做到。这是 ES5 语法,不适用于所有浏览器 (IE(,但应该适用于较新的浏览器。
有关更多信息,请参阅 John Resig 的博客。
我会推荐 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
}
}
}
相关文章:
- 在Javascript服务器/客户端中共享对象定义
- 高级布线和单个对象定义
- Javascript 对象定义
- 是否可以为数组中的每个对象定义事件侦听器
- 如何在多个文件中拆分 JavaScript 对象定义
- 将对象定义为仅包含特定类型的元素
- 如何在 javascript 中为 dom 对象定义函数
- 您可以在 JavaScript 中的私有方法中访问对象定义的属性吗?
- 在 ecma-script-6 中将对象定义为常量
- 在 JavaScript 中使用对象定义局部变量
- 如何在 JS 对象定义中引用字段
- 属性的对象定义属性设置器
- Three.js对象定义未定义
- 对象定义有两种方式-有什么区别
- JavaScript-如何在对象定义中定义属性
- 对象定义中的方括号表示法
- 仅为{..}对象定义原型
- 在对象定义中的javascript Repeating属性中(在大括号内).这是个错误吗
- 特殊的JavaScript结构:对象定义中的对象类型变量
- 在javascript对象定义中连接字符串