有什么办法可使如下内容在JavaScript中起做用? 函数
var foo = { a: 5, b: 6, c: this.a + this.b // Doesn't work };
在当前形式中,该代码明显抛出一个参考错误,由于this
不是指foo
。 可是, 是否有任何方法可使对象文字的属性值取决于先前声明的其余属性? 性能
缺乏显而易见的简单答案,所以出于完整性考虑: ui
可是, 是否有任何方法可使对象文字的属性值取决于先前声明的其余属性? this
否。这里的全部解决方案都将其推迟到建立对象以后(以各类方式),而后分配第三个属性。 最简单的方法就是这样作: spa
var foo = { a: 5, b: 6 }; foo.c = foo.a + foo.b;
全部其余方法只是作同一件事的更间接的方法。 (Felix的技巧特别聪明,可是须要建立和销毁临时函数,从而增长了复杂性;而且要么在对象上留下额外的属性,要么[若是delete
该属性]会影响对该对象的后续属性访问的性能 。) .net
若是须要所有包含在一个表达式中,则能够在没有临时属性的状况下执行此操做: code
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);
您可使用模块模式来实现。 就像: ip
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对象。
只需实例化一个匿名函数:
var foo = new function () { this.a = 5; this.b = 6; this.c = this.a + this.b; };
你能够这样
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、一、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、一、2和3。
一些关闭应该处理这个问题;
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()
属性。