0

基础

  • 一个toplevelOBJ对象在整个应用程序中用作this.toplevelOBJ,我可以在其中访问它的属性,例如this.toplevelOBJ.mapArea.coordX.
  • 其中ClassB有一个函数调用blink,它等待来自外部源的信号。
  • ClassC我需要捕获这个信号,所以我设置了一个函数,captureClassC检索由发送的信号ClassB

问题

当通过capture()函数发送到时ClassC"this"inthis.toplevelOBJ不再指的是toplevelOBJ,而是ClassC

因此,我通过函数this.toplevelOBJ作为参数发送,但在接收时,我不确定是否正在调用来自的函数:,而我可以访问它的属性:toplevelcapture()toplevelOBJtoplevel.update()toplevel.mapArea.coordX

问题

通过 anObject作为参数发送时,是否Object完全相同?因为当我检查 时Object,我在 下找到了update()函数toplevel.__proto__.__proto__,而我立即找到了它的属性:toplevel.mapArea


代码

// Class in which I am sending the object
var ClassB = exports.ClassB = ClassA.extend({
    blink: function(key, value) {
       ClassC.prototype.capture(key, value, this.toplevelOBJ);
    }
});

// Class in which I am receiving the object
var ClassC = exports.ClassC = ClassA.extend({
    capture: function(key, value, toplevel) {
        /* Run Function of toplevel */
    }
});
4

2 回答 2

0

是的,当您将对象作为参数传递时,它完全一样。

它甚至不是对象的精确副本,它实际上是同一个对象。参数只是对对象的引用,因此永远不会复制对象。


属性和方法既可以是对象本身的成员,也可以是原型链中的成员。在您的情况下,mapArea属性是对象本身的成员,而update方法是原型的成员或作为对象原型的toplevelOBJ对象。

于 2013-02-13T16:13:51.893 回答
0

在类中处理这一点的最常见方法是this在实例化时存储正确的。最常见的方法是这样的:

function SomeClass
{
 var that = this;
 that.myVariable = 5;

 that.someFunction = function()
 {
    return that.myVariable;
 }
}

您还有包装器/代理方法,例如bind下划线库中的函数所解释的,可以“强制”this变量。见http://underscorejs.org/#bind

我更喜欢这两种方法而不是调用者强制this变量。

于 2013-02-13T16:04:03.957 回答