0

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;
}
4

2 回答 2

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.capabilitiesasDeviceCapabilities返回不同的对象。

于 2012-11-14T21:35:06.133 回答
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();

*通过和谐代理,在非常现代的不太受支持的实现中,有一些方法......但这完全是另一回事。

于 2012-11-14T20:01:18.650 回答