Javascript 构造函数中构造函数的此值

Javascript 构造函数中构造函数的此值,javascript,Javascript,我以为我已经掌握了这是如何工作的,但本例中的几行代码让我有点困惑: function Bar(who) { Foo.call( this, who ); } 我对call的作用有一个合理的理解,但我无法理解为什么在这个确切的例子中它是必要的。为什么下面的代码不起作用 function Bar(who) { Foo( who ); } Foo的调用站点是否仍在Bar中,因此这将是新调用创建的对象 完整代码: function Foo(who) { this.me

我以为我已经掌握了这是如何工作的,但本例中的几行代码让我有点困惑:

function Bar(who) { 
    Foo.call( this, who );
}
我对call的作用有一个合理的理解,但我无法理解为什么在这个确切的例子中它是必要的。为什么下面的代码不起作用

function Bar(who) { 
    Foo( who );
} 
Foo的调用站点是否仍在Bar中,因此这将是新调用创建的对象

完整代码:

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();

感谢您对这个示例的介绍。

当您正常调用函数时,即foo,那么函数中的这个将引用全局对象或在严格模式下未定义的对象

Foo的调用站点是否仍在Bar中,因此这将是新调用创建的对象

它的值并不隐式地取决于调用函数的位置

发件人:

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

简单呼叫 在这种情况下,该值不是由调用设置的。由于代码未处于严格模式,因此其值必须始终为对象,因此默认为全局对象

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

通过一个物体 如果通过另一个对象调用该函数,则该对象将如下所示:

something.doIt()
即使函数之前存在指向该对象的其他对象,此值也会显示某些内容

独自 由于在函数调用之前没有对象,所以这将是浏览器中的全局对象窗口,或者如果使用strict,它将为null

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

new something.MyFunction()
将有新创建的对象的这不是什么。如果在调用真正的构造函数(如CommonJS模块加载)之前需要调用函数,则需要将第一部分用括号括起来

new (require("./MyClass"))();
调用并应用并绑定
调用、应用和绑定函数用于覆盖隐式this值。

Ah,即使该函数嵌套在另一个函数中,也是这样吗?是的。背景并不重要。只有4种方法可以调用MDN文档中列出的函数,它们决定了函数的值。我认为这比人们想象的要容易得多。啊,我感到困惑,因为我认为这将意味着新的。因此,var b1=新条b1;对不起,我更新了我的答案,也有了新的案例。
new something.MyFunction()
new (require("./MyClass"))();