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