【问题标题】:Another "this" query, JavaScript另一个“this”查询,JavaScript
【发布时间】:2014-04-09 19:38:59
【问题描述】:

以下代码用作 JavaScript 中的继承方法,但我在遵循代码时遇到问题,特别是“this”的上下文,因此我将问题添加为代码 cmets。提前感谢您的启发。

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;

抱歉,如果我误解了整件事。

【问题讨论】:

标签: javascript class inheritance this


【解决方案1】:

this 总是指函数的调用者。如果你调用像person.init() 这样的函数,那么this 指的是Person 实例。如果你调用一个函数而不指定this,比如alert(),那么它将引用window

“this”是指Class类还是Klass类?

完全没有。最后,它指的是您正在创建的新 Person 实例。

为什么将“this”应用于“this.init”?这不是默认行为吗?

如果您不使用 this 前缀,那么它将假定您在谈论其他一些变量/函数,通常是全局的,除非您有闭包。

他们都是同一个“这个”吗?

如果你的意思是Classklass,那么不是。正如第一个问题所述:this 由调用者或new 确定。

可能令人困惑的一件事是apply 的使用。 apply 所做的所有事情都允许您在调用函数之前设置函数的调用者并将任何参数作为数组传递。他们这样做的原因是允许用户传递他们自己的参数。例如,假设我们有以下两个初始化函数:

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 本质上是一个传递参数的数组。

【讨论】:

  • 我喜欢你的回答,除了第一句话。函数的调用者通常是另一个函数。例如:function foo() { bar(); }。这里,foo 将是bar 的调用者,但this 不会引用foo
  • 我很难理解为什么 this.init 需要将自己应用到自己的函数中,而不管它实际上是什么。
  • @Nate 我已经扩展了我的答案以解释他们为什么这样做。 Felix Kling:很好,我已经更新了第一句话,使其更加准确。
  • @Mike C 感谢您的回答,特别是关于使用 apply 作为传入参数的机制。这帮助我更好地理解了这种代码背后的推理。干杯。
  • 如果"use strict"; 对函数或其周围范围有效,则this 将等于undefined,但您可能需要添加提及。
【解决方案2】:

关于 Javascript 范围的 SO 上有很多很好的问题和答案,但要理解的关键概念是.. 变量的值 this 由调用者建立。你的问题的答案——“这个”几乎可以指向任何东西。

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多