2012-11-14 38 views
0

oDevice具有Connect()和Disconnect()函數。連接時,oTest.Capabilities會返回數據。斷開連接時,訪問oTest.Capabilities應該會引發異常。它看起來像在oTest.Capabilities屬性創建後,它保持相同的值。訪問該屬性不會導致它再次調用「this.oDevice.DeviceCapabilities」以獲取新值。有沒有什麼辦法讓它在每次訪問時更新?Javascript對象屬性在每次訪問時都不更新

var oTest = new Test(); 

function Test() 
{ 
    this.oDevice = new ActiveXObject("DeviceNMS.DeviceCLS"); 
    this.oDevice.Connect(); 

    this.Capabilities = this.oDevice.DeviceCapabilities; 
} 
+2

ActiveX? *不寒而慄* – NullUserException

+0

@NullUserException它是一個受控制的環境。不能在公共電腦上運行。 – user1172282

+0

它是哪個環境?它支持getter/setters嗎? – Bergi

回答

1

當您訪問將每次被稱爲時間運行屬性*

所以反之,請Capabilities功能的JavaScript將無法運行任何自定義代碼。

function Test() 
{ 
    this.oDevice = new ActiveXObject("DeviceNMS.DeviceCLS"); 
    this.oDevice.Connect(); 

    this.getCapabilities = function() { 
     return this.oDevice.DeviceCapabilities; 
    } 
} 

var oTest = new Test(); 
oTest.getCapabilities(); // note the() 

現在每次你打電話oTest.getCapabilities()您評估this.oDevice.DeviceCapabilities,並返回結果。這意味着你總能得到最新的價值。

甚至更​​好,把方法放在原型上!

function Test() 
{ 
    this.oDevice = new ActiveXObject("DeviceNMS.DeviceCLS"); 
    this.oDevice.Connect(); 
}; 

Test.prototype.getCapabilities = function() { 
    return this.oDevice.DeviceCapabilities; 
}; 

var oTest = new Test(); 
oTest.getCapabilities(); 

*有在通過和諧代理很現代沒有很好的支持實現的一些方法......但是,這是紗線的整體諾特爾球。

+0

這就是我最初實現它,但我不想使用方法來返回屬性。這對我來說似乎很混亂。你能否詳細說明「非常現代化並不很好支持」的實現? – user1172282

+1

看看這個:http://soft.vub.ac.be/~tvcutsem/proxies/ –

+0

@AlexWayne:在這裏不需要代理,聽起來他只想要一個getter的'capabilities'屬性。 – Bergi

1

IE9?然後,只要它處於標準模式,您就可以使用Object.defineProperty。我本來期望oDevice.DeviceCapabilities是一個動態更新的對象,也是如此,但如果它是靜態的,你可以使用

function Test() { 
    this.oDevice = new ActiveXObject("DeviceNMS.DeviceCLS"); 
    this.oDevice.Connect(); 

    Object.defineProperty(this, "capabilities", { 
     get: function() { 
      return this.oDevice.DeviceCapabilities; 
     } 
    }); 
} 

重建它的capabilities財產的每次訪問。因此,如果您打算連續使用它幾次(例如迭代/枚舉),請將其緩存在變量中,以免每次都調用getter函數。另請注意,myTest.capabilities !== myTest.capabilities作爲DeviceCapabilities會返回不同的對象。