gpt4 book ai didi

javascript - 您可以在 JavaScript 的私有(private)方法中访问对象定义的属性吗?

转载 作者:行者123 更新时间:2023-11-30 08:49:08 25 4
gpt4 key购买 nike

我正在构建一个大致如下所示的库。有几个变量,一个事件处理程序和一个导致相关事件触发的方法。最后,我延长了与属性(property)的交易。它是这样的(我添加了一些 ///... 我剪掉了其他代码的地方):

$.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 在我的处理程序中始终是默认值(空字符串)

感觉乱序的是我定义属性的地方——在对象的其余部分之后。就好像我在定义一个试图引用该属性的方法之后改变了对象的原型(prototype)……这是不对的。

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

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

有没有办法提前登记属性(property)?

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

最佳答案

因为 this._currentUser = username; 中的 this 不是你想的那样。 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)和 you are attaching some property to the library .将特定于插件的值附加到全局库是有风险的,因为可能会发生冲突。

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

关于javascript - 您可以在 JavaScript 的私有(private)方法中访问对象定义的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19373379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com