我开始关注 Javascript 中的原型设计和闭包,但并不完全如此。下面这个例子,我的两个对象,第二个对象似乎失去了范围/上下文并接管了第一个对象的身份。
function broker()
{
var _q = [];
this.add = function(delegate) {_q[_q.length] = delegate; }
this.broadcast = function(message)
{
for(qi = 0; qi < _q.length; qi++)
{
_q[qi](message);
}
}
}
function subscriber(abroker, yourname)
{
me = this;
this.myprop = yourname;
this.subby = function(message){ alert(message + " " + me.myprop + me.dosomething() + secret()); };
this.dosomething = function() {return "...abc";};
function secret(){return "...def";}
abroker.add(this.subby);
}
var thebroker = new broker();
var mysub = new subscriber(thebroker, 'mysub');
var myothersub = new subscriber(thebroker, 'myothersub');
thebroker.broadcast("hello from");
这个想法是有一个公共代理对象可以调用订阅者对象上的委托并在其中执行函数。但是我在代理调用的调用函数中失去了作用域。
输出: 2 个警报窗口,两个输出:“myothersub”,mysub 似乎失去了作用域?
通过在原始对象之外显式声明 subby 委托并引用整个对象,我已经成功地获得了正确的响应,例如:
而不是在订阅者对象中声明 this.subby :
mysub.subby = function(message)
{
alert(message + " " + mysub.myprop); // obv the dosomething his hidden
}
thebroker.add(mysub.subby);
如果上述任何语法有误,请直接从记忆中输入。它在实践中确实有效,但失去了我习惯的封装。
如何在对象的丢失范围/上下文中使用原始技术进行封装?