2012-03-06 65 views
1

我有這樣的功能:從對象範圍內的訪問對象的屬性JavaScript語法

function Entity(textureSrc) 
{ 
    var entity = { 

     texture: textureSrc, 
     position: { x: 0, y: 0 }, 
     test: this.texture, 

     construct: function() 
     { 
      alert(this.test); 
     } 

    } 

    return entity; 
} 

然後這個測試代碼:

var testObject = Entity("Textures/AirTexture.png"); 
testObject.construct(); 

作爲一個測試,我想在創建entity的新屬性時使用entity.texture的值 - 我無法弄清楚這樣做的語法是什麼。

我已經試過:

  • test: this.texture
  • test: entity.texture
  • test: texture

但是,這些工作;它們全部導致undefined

另外 - 是否使用this內的construct方法正確訪問test或應該以不同的方式完成?

回答

3

在「測試」行上,「this」尚不存在(因爲您正在定義它)。

但是,在構造函數中使用它是有效的,因爲這個將在該函數被評估時存在(並且將指向你期望它,除非你重新綁定函數)。

+0

好信息;那麼在我的例子中爲'test'賦值時,訪問'texture'的值時*解*是什麼? – Marty 2012-03-06 07:04:32

+0

要麼使用與用於定義紋理(textureSrc)相同的來源,要麼定義測試一次* this *已被定義(例如,在this(this)中,this.test = this.texture)。 – Corbin 2012-03-06 07:06:59

+0

啊,所以直到'this'被定義之前,沒有辦法引用屬性?有趣.. – Marty 2012-03-06 07:08:36

1

由於科爾賓說 - 也許仍然是一個不錯的主意,有約翰舊的職位之一的讀Simple "Class" Instantiation

應該指向你對創建對象的一個​​簡單快速的方法:

function Entity(textureSrc) { 

    if (!(this.instanceof Entity)) { 
     return new Entity(textureSrc) 
    } 

    this.texture = textureSrc, 
    this.position = { 
     x: 0, 
     y: 0 
    } 
} 
Entity.prototype = { 
    construct: function() { 
     alert(this.texture) 
    } 
} 

這樣你可以以你所描述的相同方式實體:

var testObject = Entity("Textures/AirTexture.png"); 
testObject.construct(); 
+0

*這個*沒有綁定到函數結構。 *這個*,在這個片段中,綁定到由實體引用的對象。在JavaScript中,函數只是另一種類型,如int(數字)或string(過度簡化)。說* this *綁定*構造*沒有什麼比說它綁定到*紋理*更有意義。另外,值得注意的是,通過定義,構造將綁定(或者更精確地綁定)到* this *而不是其他方式。 – Corbin 2012-03-06 07:14:06

+0

@corban抱歉,但你錯了!定義在構造內部的是函數'construct'的變量。Javascript函數不僅僅是另一種類型。他們有自己的範圍,在entity.construct中使用'this'不會引用對象實體。 – martin 2012-03-06 07:32:00

+0

實際上,* this *會引用任何*構造*綁定的內容。由於它在對象字面量內被聲明爲對象字面量的成員,因此它默認綁定到所述對象字面量,因此* this *將引用實體。如果你想的話,做一些console.log()'ing。 – Corbin 2012-03-06 07:35:47