Javascript OO参考了这个

时间:2013-01-11 16:37:41

标签: javascript oop

简短描述:我正在使用OO Javascript和函数声明,新关键字和原型方法(下面的示例)。我需要一种方法来引用对象的每个方法中的“self”对象。 “这个”似乎只有在我直接调用方法时才有效,否则“this”似乎指的是所谓的方法。

更多细节:这是我的对象的简化版本。

function Peer(id) {
    this.id = id;
    this.pc = new RTCPeerConnection(SERVER);

    this.pc.onevent1 = this.onEvent1;
    this.pc.onevent2 = this.onEvent2;
}

Peer.prototype.doSomething = function() {
    // create offer takes one param, a callback function
    this.pc.createOffer(this.myCallback);
};

Peer.prototype.onEvent1 = function(evt) {
    // here this refers to the RTCPeerConnection object, so this doesn't work
    this.initSomething(evt.data);    
};

Peer.prototype.myCallback = function(data) {
    // here this refers to the window object, so this doesn't work
    this.setSomething = data;
};

Peer.prototype.initSomething = function(data) {
    // use data
};

这是一个使用它的示例。

var peer = new Peer(1);
peer.doSomething();
// eventually something triggers event1

我尽可能地简化代码并在评论中解释问题。我为第一个场景(调用this.myCallback)创建了一个解决方法,创建了一个本地副本,并使回调参数成为一个匿名函数,使用我的本地副本调用我需要的函数。但第二种情况更麻烦(事件发生)。

我很好奇是否存在面向对象编程的不同模型,其中每个方法总是对父对象有适当的引用,无论该方法是如何被调用的?或者,如果有不同的方法将对象创建为自定义对象的属性并将其事件绑定到自定义对象的方法?对不起,如果这是令人困惑的语言!请注意,我的问题与RTCPeerConnection无关,这恰好是我目前正在处理的项目。

我发现这篇文章:http://www.alistapart.com/articles/getoutbindingsituations但我不完全确定如何使用这些信息?

2 个答案:

答案 0 :(得分:6)

  

我很好奇是否存在面向对象编程的不同模型,其中每个方法总是对父对象有适当的引用,而不管方法是如何被调用的?

是的,有:它被称为Function.bind

function Peer(id) {
    this.id = id;
    this.pc = new RTCPeerConnection(SERVER);

    this.pc.onevent1 = this.onEvent1.bind(this);
    this.pc.onevent2 = this.onEvent2.bind(this);
}

同样,myCallback的{​​{1}}始终引用this个实例:

Peer

答案 1 :(得分:1)

方法只是一个定义为原型属性的函数。它本身没有任何特定的对象上下文,这是有原因的,因为可以存在给定类型的无限数量的对象,因此该方法在给定特定对象的上下文时有效。

在javascript(以及其他OO语言)中,该对象上下文由调用者提供。这样做的经典方法是在特定对象上调用方法:

obj.method();

但是,您也可以使用this.apply().call().bind()指针设置为其他指针。您可以在MDN上阅读所有这些内容。某些旧浏览器不支持.bind(),因此您需要使用垫片或使用其他解决方案(我使用下面提到的解决方案)。

因此,调用者必须负责确保this ptr设置正确。这就是javascript的工作原理。

尝试将方法调用作为回调传递时,另一种设计模式是:

var self = this;
callMeWhenDone(function() {
    self.myMethod();
});

在这里,您将this ptr保存在局部变量中并使用它从匿名回调中调用方法,因为回调中的this指针将被设置为其他值。

注意:在内部,.bind()只是做与此解决方法类似的事情。