Javascript 私有对象属性
我得到了一个RequireJs模块,它引用了另一个模块并代理了其中的一些方法。我现在想隐藏模块实例本身,只允许通过代理方法进行访问Javascript 私有对象属性,javascript,object,prototype,requirejs,private,Javascript,Object,Prototype,Requirejs,Private,我得到了一个RequireJs模块,它引用了另一个模块并代理了其中的一些方法。我现在想隐藏模块实例本身,只允许通过代理方法进行访问 define(['mediator'], function(Mediator) { var Proxy; Proxy = function(prefix) { this.prefix = prefix; this.mediator = new Mediator(); }; Proxy.prototype.on = functio
define(['mediator'], function(Mediator) {
var Proxy;
Proxy = function(prefix) {
this.prefix = prefix;
this.mediator = new Mediator();
};
Proxy.prototype.on = function(event, callback, context) {
this.mediator.subscribe(this.prefix + event, callback, context || this);
};
Proxy.prototype.off = function(event, callback, context) {
this.mediator.unsubscribe(this.prefix + event, callback, context || this);
};
Proxy.prototype.trigger = function() {
arguments[0] = this.prefix + arguments[0];
this.mediator.trigger.apply(this.mediator, arguments);
};
return Proxy;
});
require(['proxy'], function(Proxy) {
var proxy = new Proxy('sample:');
// this access is secured and bound to the prefix
// I cannot mess up with other events which do not belong to me
proxy.on('log', function(message) { console.log(message); });
proxy.trigger('log', 'hi hello');
// unfortunately there still would be a hack to leave my event scope
proxy.mediator.trigger('outerscope:test', 'blabla');
});
如您所见,可以访问代理原型的内部使用的中介对象,并将其搞糟
我现在想以某种方式隐藏中介实例,但不知道在哪里。
我可以将其存储在requirejs模块回调中的某个普通变量中,但这对requirejs不起作用,可能会导致重叠
那我还能做什么呢
更新:
define(['mediator'], function(Mediator) {
var Proxy;
var mediator = new Mediator();
Proxy = function(prefix) {
this.prefix = prefix;
};
Proxy.prototype.on = function(event, callback, context) {
mediator.subscribe(this.prefix + event, callback, context || this);
};
Proxy.prototype.off = function(event, callback, context) {
mediator.unsubscribe(this.prefix + event, callback, context || this);
};
Proxy.prototype.trigger = function() {
arguments[0] = this.prefix + arguments[0];
mediator.trigger.apply(this.mediator, arguments);
};
return Proxy;
});
require(['proxy'], function(Proxy) {
var proxy = new Proxy('sample:');
proxy.on('log', function(message) { console.log(message); });
});
这是Javascript中闭包内封装变量的典型示例。您需要将中介实例定义为与
代理
在同一范围内的局部变量。这将允许代理对象通过闭包访问Mediator
,但会将Mediator与define回调之外的代码隔离。所以像这样:
define(['mediator'], function(Mediator) {
// Make mediator local scope variable
var mediator = new Mediator(),
Proxy = function(prefix) {
this.prefix = prefix;
};
Proxy.prototype.on = function(event, callback, context) {
mediator.subscribe(this.prefix + event, callback, context || this);
};
// ... rest of the code
return Proxy;
});
您所说的
这对requirejs不起作用并且可能导致重叠是什么意思?这是封装中介实例的好方法。它将可用于代理,但不能用于外部。正是你需要的。@dfsq你能写一个答案让我记下来吗?