oDevice具有Connect()和Disconnect()函数。连接后,oTest.Capabilities返回数据。断开连接时,访问oTest.Capabilities应该抛出异常。看起来在创建oTest.Capabilities属性后,它保持相同的值。访问该属性不会导致它再次调用“this.oDevice.DeviceCapabilities”来获取新值。是否有任何方法可以在每次访问时更新它?
var oTest = new Test();
function Test()
{
this.oDevice = new ActiveXObject("DeviceNMS.DeviceCLS");
this.oDevice.Connect();
this.Capabilities = this.oDevice.DeviceCapabilities;
}
答案 0 :(得分:1)
当您访问属性*时,Javascript将不会运行任何自定义代码
相反,让Capabilities
成为每次调用时都会运行的函数。
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();
*通过和声代理在非常现代的非常好支持的实现中有一些方法...但这是一个完整的纱线球。
答案 1 :(得分: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
会返回不同的对象。