JavaScript的OO参考此(Javascript OO reference this)

2019-07-18 02:47发布

简短说明:我使用OO的Javascript函数的声明,新的关键字,和原型方法(下面的例子)。 我需要一种方法来对对象的每个方法中引用的“自我”对象。 “这个”似乎如果我直接调用方法才有效,否则“这”似乎是指什么叫做替代方法。

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

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

我试图简化代码,尽可能和注释说明问题。 我创建的这一个本地副本,使回调PARAM调用我需要使用我的本地的这个副本功能的匿名函数创建一个解决方法的第一个方案(调用this.myCallback)。 但第二种情况是比较麻烦的(事件触发)。

我很好奇,如果有一个面向对象的程序设计,其中每个方法总是有一个适当的参考父对象,不管是如何调用该方法的不同模式? 或者,如果有一种不同的方式来创建一个对象作为自定义对象的属性和约束其活动到自定义对象的方法? 很抱歉,如果这是令人困惑的语言! 请注意,我的问题无关与RTCPeerConnection,那正好是我目前工作的项目。

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

Answer 1:

我很好奇,如果有一个面向对象的程序设计,其中每个方法总是有一个适当的参考父对象,不管是如何调用该方法的不同模式?

是的,有:这就是所谓的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);
}

同样,对于myCallbackthis总是引用Peer的实例:

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


Answer 2:

一种方法就是这样的已定义为在原型属性的功能。 它本身不具有任何特定的对象上下文,这是有原因的,因为可以有一个给定类型的对象无限多这样给特定对象的情况下,当方法工作。

在JavaScript(和在其它面向对象的语言太),该对象上下文由调用者提供。 这样做的经典的方式是你调用特定对象上的方法:

obj.method();

但是,你也可能会导致this指针设置为东西用别的.apply().call().bind() 你可以阅读所有的人都在MDN。 .bind()所以你必须要么使用垫片或使用不同的解决方案(我用下面提到的一个)不支持一些旧的浏览器。

因此,主叫方必须采取确保责任this PTR设置为合适。 那怎么JavaScript的工作。

试图通过方法调用作为回调时的另一种设计模式,解决办法是这样的:

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

在这里,你保存this PTR在一个局部变量,并用它来从一个匿名回调调用一个方法,因为this指针在回调将被设置为别的东西。

注意:在内部, .bind()只是做类似这样的解决方法的东西。



文章来源: Javascript OO reference this