Javascript对象属性不会在每次访问时更新

时间:2012-11-14 19:55:58

标签: javascript oop object properties

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

2 个答案:

答案 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.capabilitiesDeviceCapabilities会返回不同的对象。