javascript调用函数里面的另一个谜

时间:2009-02-11 15:02:53

标签: javascript

功能Obj1(param)     {         this.test1 = param || 1;     }

function Obj2(param, par)
{
    this.test2 = param;
    this.ob = Obj1;
    this.ob(par);
}

现在为什么我这样做:

alert(new Obj2(44,55).test1); 

输出是55?如果我没有,怎么能'看'test1是一个Obj2 通过原型链链接?

由于

4 个答案:

答案 0 :(得分:7)

嗯,目前还不清楚你想要什么但发生这种情况的原因是因为:

this.ob = Obj1;

将Obj1方法添加到Obj2的对象实例中,并在此处使用它:

this.ob(par); 

方法Obj1中的“this”的上下文是 Obj2实例。所以该实例现在有一个test1成员。

与继承无关,但它有点像混合。请记住,JS函数是第一类对象。

答案 1 :(得分:5)

让我们将Obj1视为功能。所以,当你做的时候

function Obj2(param, par)
{
    this.test2 = param;
    this.ob = Obj1;
    this.ob(par);
}

您的代码与以下代码完全相同:

function Obj2(param, par)
{
    this.test2 = param;
    this.ob = function (param) { this.test1 = param || 1; }
    this.ob(par);
}

答案 2 :(得分:2)

  

如果我没有通过原型链链接,怎么能'查看'test1是一个Obj2?

方法不受JavaScript限制。当你写下以下之一时:

o.method(x);
o['method'](x);

在方法中将'o'的值赋给'this'。但!如果从该对象中分离该函数并直接调用它:

m= o.method;
m(x);

对'o'的引用丢失,并且该方法被称为就像它是一个普通的旧函数一样,全局对象为'this'。类似的,如果你将函数移动到另一个对象并在那里调用它:

o2.method= o.method;
o2.method(x);

然后'this'将是'o2',而不是'o'。对于具有一流功能的语言而言,这是非常奇怪的行为,而且非常反直觉,但这是适合您的JavaScript。

如果您希望能够使用绑定方法,则需要创建自己的方法,通常使用闭包。请参阅ECMAScript 3.1提出的“Function.bind”方法或许多框架中的类似实现。

所以无论如何:

this.ob = Obj1;
this.ob(par);

这是将Obj1作为一个函数并转换为'this'的方法,这是一个Obj2实例。因此,当Obj1被调用时,它自己的'this'也是一个Obj2,那就是'this'它写它的参数。同样可以更简单明了地写成:

Obj1.call(this, par);
你是故意这样做的吗?它可以用作一种继承,在你自己的类上调用另一个类的构造函数,这个方法在一些JS面向对象的教程中讲授。然而,它真的不是一个非常好的方法,因为你最终得到了相同属性的多个副本;使用原型可以节省你的时间,并在超类上过滤属性更新到预期的子类。

答案 3 :(得分:1)

函数内部的this取决于您调用函数的方式。如果您将其称为sender.fn(),则thissender(您的情况)。如果以fn()执行,则this是全局对象。

相关问题