构造函数中构造函数的这个值

时间:2014-10-07 18:21:23

标签: javascript

我以为我正在处理this的工作方式,但本例中的几行代码让我感到困惑:

function Bar(who) { 
    Foo.call( this, who );
}

我对call()的作用有一个合理的理解,但我无法理解为什么在这个确切的例子中有必要。为什么以下代码不起作用?

function Bar(who) { 
    Foo( who );
} 

Foo的呼叫网站仍然不在Bar内,因此this将是new呼叫创建的对象吗?

完整代码:

function Foo(who) {
    this.me = who;
}

Foo.prototype.identify = function() {
    return "I am " + this.me;
};

function Bar(who) {
    Foo.call( this, who ); 
}

Bar.prototype = Object.create( Foo.prototype ); 

Bar.prototype.speak = function() {
    alert( "Hello, " + this.identify() + "." );
};

var b1 = new Bar( "b1" );
var b2 = new Bar( "b2" );

b1.speak();
b2.speak();

感谢您在此示例中获得的任何亮点。

2 个答案:

答案 0 :(得分:0)

当您调用函数"通常",即foo()时,函数内的this将引用全局对象(或严格模式下的undefined

  

Foo的呼叫网站是否仍在Bar内,因此这将是新呼叫创建的对象?

this的值不(隐含地)取决于函数的调用位置。

来自MDN documentation

  

功能上下文

     

在函数内部,其值取决于函数的调用方式。

     

简单的通话

function f1(){
   return this;
}
f1() === window; // global object
     

在这种情况下,调用不会设置this的值。由于代码不是严格模式,this的值必须始终是一个对象,因此它默认为全局对象。

答案 1 :(得分:0)

this值可能变得相当复杂,但有一个非常简单的规则:

通过对象

如果通过另一个对象调用该函数,则该对象将是:

something.doIt()

something将是this值,即使在函数之前有一些其他对象通向对象。

就其本身而言

doIt()

由于在函数调用之前没有对象,this将是全局对象(浏览器中的窗口),或者如果您使用"使用严格&#34,它将是null ;;

使用新

还有另一条规则。如果使用new运算符调用该函数,则this值将是新创建的对象。

new something.MyFunction()

将新创建的对象this something。如果你在调用真正的构造函数之前需要函数调用,比如CommonJS模块加载,你需要将第一部分包装在括号中。

new (require("./MyClass"))();

致电并申请(和绑定)

callapplybind函数用于覆盖隐式this值。