gpt4 book ai didi

javascript - 如何找到方法所属的实例?

转载 作者:搜寻专家 更新时间:2023-11-01 04:34:14 24 4
gpt4 key购买 nike

//缩小基类代码(如果需要未压缩的代码,我会发布) 函数类(){}Class.prototype.construct=function(){};Class.extend=function(c){var a=function(){arguments[0]!==Class&&this.construct.apply(this,arguments )},d=new this(Class),f=this.prototype;for(var e in c){var b=c[e];if(b instanceof Function)b.$=f;d[e]= b}a.prototype=d;a.extend=this.extend;return a};

// custom event class
var Event = Class.extend({
handlers: [],
// stores the event handler
subscribe: function(handler, thisObj) {
this.handlers.push([handler, thisObj]);
},
// calls the event handlers
fire: function() {
for(i in this.handlers) {
var handler = this.handlers[i];
handler[0].apply(handler[1]);
}
}
});
var Class2 = Class.extend({
myEvent: new Event(), // the event
test: function() { // fires the event
this.myEvent.fire(this);
}
});
var Class3 = Class.extend({
construct: function(model) {
this.name = "abc";
model.myEvent.subscribe(this.handler, this); // subscribe to the event
},
handler: function() {
alert(this.name); // alerts 'abc'
}
});
var instance1 = new Class2();
var instance2 = new Class3(instance1);
instance1.test();

使事件处理程序代码与良好的“this”一起工作的唯一方法是向“subscribe”方法添加一个新参数(“thisObj”)?有更好的方法吗?

最佳答案

你得到的行为是由于这样一个事实,即当你将一个“方法”传递给一个函数时,接收函数不知道它是一个方法。它只是一个需要执行的 javascript block 。

Prototype 使用 bind 方法解决了这个问题

您可以通过使用闭包获得类似的行为(我没有查看绑定(bind)的实现细节)。

var Class3 = Class.extend({
construct: function(model) {
this.name = "abc";
//model.myEvent.subscribe(this.handler, this); // subscribe to the event
var self = this;
model.myEvent.subscribe(function() {self.handler()});
},
handler: function() {
alert(this.name); // alerts 'abc'
}
});

或者将一些类似的功能应用于自定义事件类的订阅方法。

已编辑 以反射(reflect) CMS 的观察结果。谢谢!

关于javascript - 如何找到方法所属的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3085115/

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