使用对象构造函数时,可以将属性直接分配给先前定义的属性的值:
var foo = new (function() {
this.bar = 5;
this.baz = this.bar;
})();
alert(foo.baz) // 5
我想引用OBJECT LITERAL中先前定义的属性:
var foo = {
bar : 5,
baz : bar
}
alert (foo.baz) // I want 5, but evaluates to undefined
我知道我可以这样做:
var foo = {
bar : 5,
baz : function() {
alert(this.bar); // 5
}
但是我想直接将baz分配给值而不是函数。有什么想法吗?
答案 0 :(得分:3)
不,在创建对象文字之前,您将无法使用它的任何属性。你最近的选择可能是使用像这样的临时变量:
var tmp = 5,
foo = {
bar : tmp,
baz : tmp
}
如果您可以自由使用ECMAScript 5功能,则可以为baz
属性编写一个getter函数,而不是返回bar
的值:
var yourObject = {
bar: 5
};
Object.defineProperty(yourObject, 'baz', {
get: function () { return yourObject.bar; }
});
答案 1 :(得分:1)
您也可以按部分构建文字:
var foo = {bar:5};
foo.baz = foo.bar;
如果你需要在表达式(而不是通过多个语句)中使用它,你可以尝试滥用逗号运算符或者你可以创建一个辅助函数:
(警告:未经测试的代码)
function make_fancy_object(base_object, copies_to_make){
var i, copy_from, copy_to_list;
for(copy_from in copies_to_make){
if(copies_to_make.hasOwnProperty(copy_from)){
copy_to_list = copies_to_make[copy_from];
for(var i=0; i<copy_to_list.length; i++){
base_object[copy_to_list[i]] = base_object[copy_from];
}
}
}
}
var foo = make_fancy_object(
{bar: 5},
{bar: ["baz", "biv"]}
);
//foo.baz and foo.biv should be 5 now as well.