【问题标题】:Javascript object property doesn't update each time it's accessedJavascript 对象属性在每次访问时都不会更新
【发布时间】:2012-11-03 09:22:48
【问题描述】:

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

【问题讨论】:

  • @NullUserException 这是一个受控环境。不能在公共 PC 上运行。
  • 是哪个环境?它是否支持 getter/setter?
  • @Bergi Just IE9 在运行本地网页的私人 PC 上。我认为 NullUserException 不寒而栗是因为 ActiveXObjects 的安全漏洞,这就是为什么我说它是一个受控环境。
  • @user1172282: IE[9]? 颤抖 :-)

标签: javascript oop object properties


【解决方案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();

*在非常现代的实现中,有一些方法通过和谐代理得到了很好的支持……但那完全是另一回事了。

【讨论】:

  • 这就是我最初实现它的方式,但我不想使用方法来返回属性。这对我来说似乎很乱。您能否详细说明“非常现代但支持不充分”的实现?
  • @AlexWayne:这里不需要代理,听起来他只想要capabilities 属性的getter。
  • @AlexWayne 这很有趣,但不幸的是我使用的是 IE9,它看起来还没有实现。除非有其他方法,否则我可能不得不使用方法。
  • @Bergi 你是对的,Object.defineProperty 在这里可能会更好。它得到了更广泛的支持。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多