对象常量/初始化程序中的自引用

有什么办法可使如下内容在JavaScript中起做用? 函数

var foo = {
    a: 5,
    b: 6,
    c: this.a + this.b  // Doesn't work
};

在当前形式中,该代码明显抛出一个参考错误,由于this不是指foo 。 可是, 是否有任何方法可使对象文字的属性值取决于先前声明的其余属性? 性能


#1楼

缺乏显而易见的简单答案,所以出于完整性考虑: 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);

#2楼

您可使用模块模式来实现。 就像: 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对象。

http://jsfiddle.net/jPNxY/1/


#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、一、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。


#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()属性。

相关文章
相关标签/搜索