有什么办法可以使以下内容在JavaScript中起作用?
var foo = {
a: 5,
b: 6,
c: this.a + this.b // Doesn't work
};
在当前形式中,该代码明显抛出一个参考错误,因为this不是指foo 。 但是, 是否有任何方法可以使对象文字的属性值取决于先前声明的其他属性?
#1楼
缺少显而易见的简单答案,因此出于完整性考虑:
但是, 是否有任何方法可以使对象文字的属性值取决于先前声明的其他属性?
否。这里的所有解决方案都将其推迟到创建对象之后(以各种方式),然后分配第三个属性。 最简单的方法就是这样做:
var foo = {
a: 5,
b: 6
};
foo.c = foo.a + foo.b;
所有其他方法只是做同一件事的更间接的方法。 (Felix的技巧特别聪明,但是需要创建和销毁临时函数,从而增加了复杂性;并且要么在对象上留下额外的属性,要么[如果delete该属性]会影响对该对象的后续属性访问的性能 。)
如果需要全部包含在一个表达式中,则可以在没有临时属性的情况下执行此操作:
var foo = function(o) {
o.c = o.a + o.b;
return o;
}({a: 5, b: 6});
或者,当然,如果您需要多次执行此操作:
function buildFoo(a, b) {
var o = {a: a, b: b};
o.c = o.a + o.b;
return o;
}
然后在需要使用它的地方:
var foo = buildFoo(5, 6);
#2楼
您可以使用模块模式来实现。 就像:
var foo = function() {
var that = {};
that.a = 7;
that.b = 6;
that.c = function() {
return that.a + that.b;
}
return that;
};
var fooObject = foo();
fooObject.c(); //13
使用这种模式,您可以根据需要实例化几个foo对象。
#3楼
只需实例化一个匿名函数:
var foo = new function () {
this.a = 5;
this.b = 6;
this.c = this.a + this.b;
};
#4楼
你可以这样
var a, b
var foo = {
a: a = 5,
b: b = 6,
c: a + b
}
当我不得不引用最初声明函数的对象时,该方法对我来说非常有用。 以下是我的用法的最小示例:
function createMyObject() {
var count = 0, self
return {
a: self = {
log: function() {
console.log(count++)
return self
}
}
}
}
通过将self定义为包含打印功能的对象,可以允许该功能引用该对象。 这意味着如果您需要将打印功能传递到其他对象,则无需将其“绑定”到对象。
如果可以,请如下所示使用this
function createMyObject() {
var count = 0
return {
a: {
log: function() {
console.log(count++)
return this
}
}
}
}
然后下面的代码将记录0、1、2,然后给出一个错误
var o = createMyObject()
var log = o.a.log
o.a.log().log() // this refers to the o.a object so the chaining works
log().log() // this refers to the window object so the chaining fails!
通过使用self方法,可以确保print总是返回相同的对象,而不管函数在哪个上下文中运行。 使用createMyObject()的自我版本时,上面的代码可以正常运行并记录0、1、2和3。
#5楼
一些关闭应该处理这个问题;
var foo = function() {
var a = 5;
var b = 6;
var c = a + b;
return {
a: a,
b: b,
c: c
}
}();
所有内声明的变量foo是私有foo ,因为你会用任何函数声明希望因为他们都在范围内,他们都无需指互相访问this ,正如你所期望的一个功能。 不同之处在于此函数返回一个对象,该对象公开私有变量并将该对象分配给foo 。 最后,使用return {}语句仅返回要作为对象公开的接口。
然后,该函数在最后以()执行,该赋值将对整个foo对象进行求值,实例化其中的所有变量,并将返回对象添加为foo()属性。