下面的代码被用作JavaScript中的继承方法,但我在理解代码时遇到了问题,特别是"this"的上下文,所以我添加了一些问题作为代码注释。提前感谢您的启蒙。
var Class = function(){
var klass = function(){
//Is "this" referring to the Class class or Klass class?
//Why is "this" being applied to "this.init"? Isn't this default behavior?
//Are they both the same "this"?
this.init.apply(this, arguments);
};
klass.prototype.init = function(){};
return klass;
};
var Person = new Class;
Person.prototype.init = function(){
// Called on Person instantiation
};
// Usage:
var person = new Person;
如果我误解了整件事,我深表歉意。
this
总是指函数的调用方。如果调用类似person.init()
的函数,则this
引用Person
实例。如果您调用一个函数而没有像alert()
那样指定this
,那么它将引用window
。
"this"指的是Class类还是Klass类?
两者都不是。最后,它指向您正在创建的新Person
实例。
为什么将"this"应用于"this.init"?这不是默认行为吗?
如果你不以this
为前缀,那么它将假设你谈论的是其他一些变量/函数,通常是全局的,除非你有闭包。
它们都是同一个"这个"吗?
如果你指的是Class
和klass
,那么不是。正如第一个问题所说:this
由调用者或new
决定。
有一件事可能令人困惑,那就是apply
的使用。apply
所做的一切都允许您在调用函数之前设置函数的调用方,并将任何参数作为数组传递。他们这样做的原因是允许用户传递自己的参数。例如,假设我们有以下两个init函数:
Person.prototype.init = function(name) {
this.name = name;
};
Person2.prototype.init = function(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
};
klass
需要通过某种方式将这些参数传递给init函数。它使用apply
来完成此操作。因此,以下在功能上是等效的:
var klass = function(a, b) {
this.init(a, b);
};
// This one can take ANY number of arguments, not just two
var klass = function() {
this.init.apply(this, arguments);
};
这是因为arguments
本质上是一个传递参数的数组。
关于SO,有很多关于Javascript范围的好问题和答案,但要理解的关键概念是..变量的值,这是由调用者建立的。你的问题的答案——"这个"几乎可以指向任何东西。