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

有什麼辦法可使如下內容在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()屬性。

相關文章
相關標籤/搜索