[英]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) {
/// ...
}
});
});
这是我所看到的:
registrationComplete
事件触发,并且处理程序成功调用 this._currentUser
this._currentUser = username
执行并设置了值 onEditorsUpdated
事件触发时, collidR.currentUser
始终是我的处理程序中的默认值(空字符串) 感觉混乱的是我定义属性的位置-在对象的其余部分之后。 好像我在定义尝试引用属性的方法之后改变了对象的原型……这是不对的。
我也尝试过this.currentUser
(在内部方法中),但结果相同。
我假设如果在调用内部方法之前扩展了原型,那么在执行此操作时, var currentUser = collidR.currentUser;
我将从属性中获取值,但它始终是一个空字符串。
有没有一种更早注册属性的方法?
是否有正确的方法设置值,以便以后可以通过暴露的属性访问它?
因为this
在this._currentUser = username;
不是你想的那样。 JavaScript中this
的值取决于函数的调用方式。 我假设在处理程序内部,它现在引用的是hubProxy
或collidR
以外的其他对象。
假设你的整个插件的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.