Javascript pub/sub 实现适用于函数,但不适用于对象的方法
Javascript pub/sub implementation works for functions, but not objects' methods
我正在尝试在javascript中实现一个简单的Pub/Sub对象,这是我的代码:
var PubSub=new function(){
this.subscriptions=[];
this.subscribe=function(topic,callback){
if(!this.subscriptions[topic]){
this.subscriptions[topic]=[];
}
this.subscriptions[topic].push(callback);
}
this.unsubscribe=function(topic,callback){
if(this.subscriptions[topic]){
for(var i=this.subscriptions[topic].length-1;i>=0;i--){
if(this.subscriptions[topic][i]==callback){
this.subscriptions[topic].splice(i,1);
}
}
}
}
this.publish=function(topic,data){
if(this.subscriptions[topic]){
for(var i=this.subscriptions[topic].length-1;i>=0;i--){
this.subscriptions[topic][i](data);
}
}
}
}
现在,订阅一个简单的函数,然后发布一些东西效果很好:
PubSub.subscribe("test",print); //print: shell function
PubSub.publish("test","hello"); //print outputs "hello"
但是,订阅一个函数,这是一个对象的方法不起作用:
var a=new function(){
this.c=0;
this.i=function(x){
this.c+=x;
}
}
PubSub.subscribe("test",a.i);
PubSub.publish("test",17);
a.c; //is still 0
我还尝试使用apply(假设数据是一个数组):
PubSub.publish=function(topic,data){
...
this.subscriptions[topic][i].apply(this,data);
...
}
它也不起作用,尽管我相信这不是同一个问题:我认为 apply 传递的this
对象会覆盖a
的this
对象,因此a.i
尝试设置PubSub.a
而不是a.a
......
当你将a.i
传递给PubSub.subscribe
时,你已经将i
函数从它的调用上下文a
中"分离"出来。使用匿名函数来维护绑定:
PubSub.subscribe("test", function (x) { a.i(x); });
或者使用Function.bind
在调用i
时保留a
this
:
PubSub.subscribe("test", a.i.bind(a));
注:注: 并非所有浏览器都支持Function.bind
,因此您需要使用填充程序。
相关文章:
- HTML5 Canvas toDataURL(“image/png”)适用于一些绘画,而有些则不然,不确定原因
- JavaScript不显示剩余字符,但适用于其他页面
- 我如何完善这个Javascript代码,使其只适用于来自图像的链接(而不是来自文本的链接)
- 为什么这只适用于身体部分而不是头部
- 为什么不't此正则表达式适用于重复出现的对
- document.getElementById 对内部 html 的调用适用于 $_POST 和 $_GET 变量,但不
- JavaScript 位置适用于本地主机而不是服务器
- Rally App SDK 2.0:Rallymultiobjectpicker,适用于不显示displayField的
- jQuery事件在Mozilla上不起作用,并且适用于其他浏览器
- Angular.js - 控制器不为索引执行,适用于其余模板
- D3 .on 更改适用于文本而不是图表
- Zillow 数据 - json_encode不起作用 - 适用于常规变量
- 弹出模式仅适用于表格中的第一个元素,第二次单击后不会再次打开
- Phonegap Android项目适用于模拟器,而不是实际的手机
- ajax jonp 不应该适用于 请求的上不存在“访问控制-允许源”标头
- AngularJS:ng-单击不起作用,适用于<按钮>
- Javascript不会在移动设备上加载.适用于桌面
- 为什么我的代码适用于高度:100px,而不是高度:100%
- 拖放区.js + Laravel-多文件上传不起作用(仅适用于一个文件)
- 哪些限制适用于不透明响应