繁体   English   中英

您可以使用JavaScript的私有方法访问对象定义的属性吗?

[英]Can you access an object-defined property in a private method in JavaScript?

我正在建立一个大致如下所示的库。 有几个变量,一个事件处理程序和一个导致相关事件触发的方法。 最后,我扩大了与财产的交易。 就像这样(我在///...中添加了一些其他代码):

$.collidR = function (options) {

  /// ...

  var hubName = 'CollidRHub';
  var hubProxy = connection.createHubProxy(hubName);   

  /// ...

  hubProxy.on('registrationComplete', function (username, hasChanges) {
      $(window).triggerHandler(events.onRegistrationComplete, { username: username, hasChanges: hasChanges });
      log(username + " has successfully registered for this entity.");

      // capture current user 
      this._currentUser = username;

      // hook for catching up when user joins after edits
      if (hasChanges) {
          log("There are outstanding changes for this entity...");

      }
  }); 

  /// ...

  this.registerClient = function () {
      /// does some stuff that makes registrationComplete fire
      /// ...
  };

};

Object.defineProperty($.collidR.prototype, "currentUser", {
    get: function () {
        return this._currentUser ? this._currentUser : "";
    }
});

请注意,在this._currentUser = username上方似乎不起作用。 我认为这是封装的问题,这是这个问题正在发展的方向。

在一个独立但相关的库中,我创建了collidR的实例,并且需要响应一个事件。 我已经为此设置了处理程序,如下所示:

$(window).on(collidR.events.onEditorsUpdated, function (e, data) {

  /// ...

  users.forEach(function (user) {
      var currentUser = collidR.currentUser;

      // here, currentUser is always default of ""
      if (user != currentUser) {
          /// ...
      }
  });

});

这是我所看到的:

  1. 我的registrationComplete事件触发,并且处理程序成功调用
  2. 从调试器中,在设置值之前未定义this._currentUser
  3. 这行this._currentUser = username执行并设置了值
  4. onEditorsUpdated事件触发时, collidR.currentUser始终是我的处理程序中的默认值(空字符串)

感觉混乱的是我定义属性的位置-在对象的其余部分之后。 好像我在定义尝试引用属性的方法之后改变了对象的原型……这是不对的。

我也尝试过this.currentUser (在内部方法中),但结果相同。

我假设如果在调用内部方法之前扩展了原型,那么在执行此操作时, var currentUser = collidR.currentUser; 我将从属性中获取值,但它始终是一个空字符串。

有没有一种更早注册属性的方法?

是否有正确的方法设置值,以便以后可以通过暴露的属性访问它?

因为thisthis._currentUser = username; 不是你想的那样。 JavaScript中this的值取决于函数的调用方式。 我假设在处理程序内部,它现在引用的是hubProxycollidR以外的其他对象。

假设你的整个插件的this是指collidR (我强烈怀疑是不是,在部分解释在此之后),你可以做的是保存范围的情况下进入处理程序之外的另一个变量。 这样,您可以通过该变量引用外部作用域的上下文:

// Saving this scope's context
var that = this;

hubProxy.on('registrationComplete', function (username, hasChanges) {

  // access _currentUser via the saved context
  that._currentUser = username;

});

但是,我应该警告您使用this 假设您正在创建一个插件,您将像$.collidR({..})这样调用它。 在这种情况下,函数内部的this将引用$ (我认为是jQuery),并且您将一些属性附加到库中 将特定于插件的值附加到全局库是有风险的,因为可能会发生冲突。

我建议您将其存储在局部变量/对象中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM