【问题标题】:JavaScript setting variables with a constructorJavaScript 使用构造函数设置变量
【发布时间】:2019-02-22 20:44:09
【问题描述】:

我试图在可以由嵌套函数表达式调用的构造函数中设置一个变量。不太清楚如何做到这一点

var test = function() {
  var a;

  function test(a, b, c) {
    this.a = a;
    this.b = b;
    this.c = c;

  }
  test.getvariableA = function() {
    //not returning a variable that is supposed to be set by the constructor
    console.log(this.a);
  };
  return test;
}();

var t = new test("pizza", "pasta", "steak");
//does not return the variable
test.getvariableA();
//this returns the variable
console.log(t.a);

test.getvariableA();

这应该返回构造函数设置的变量。也许我对另一种语言感到困惑 感谢您提前提供任何帮助。

【问题讨论】:

  • 你会用es6吗?这可能对你有帮助developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • @chevybow 不。我必须保持结构不变,而不需要进行基于类的声明
  • 您认为new test 究竟返回了什么?尝试重命名变量。之后,只需单步执行代码,看看哪里出错了。

标签: javascript variables nested-function


【解决方案1】:

这将返回变量:console.log(t.a);

正确,所以属性在 t 实例上。

但是您的test.getvariableA 函数根本不知道t!当您调用 test.getvariableA() 时,它会尝试访问 test.a

您可能希望将方法放在类的原型对象上,而不是构造函数本身。这样它将被所有实例继承(如t),您可以在t 上调用它以获取t.a

var test = function() {
  // var a; - this is not used anywhere, drop it

  function test(a, b, c) {
    this.a = a;
    this.b = b;
    this.c = c;

  }
  test.prototype.getVariableA = function() {
//    ^^^^^^^^^^
    console.log(this.a);
  };
  return test;
}();

var t = new test("pizza", "pasta", "steak");
t.getVariableA(); /*
^ */
console.log(t.a);

【讨论】:

    【解决方案2】:

    这里的问题是您在构造函数之外定义getvariableA,并将其附加到函数test。因此getvariableA 是一个“公共”方法,并不指向您创建的t 实例(或您将使用new 关键字创建的任何其他实例)。

    换句话说,test.getvariableA 内部的this 指向函数构造函数本身,而不是此构造函数的任何特定实例(在您的示例中为t)。

    当你将一个方法附加到构造函数之外的函数时,你可以在不创建新实例的情况下访问它。如果您 console.log(test.getvariableA) 您可以看到您无需创建 new 实例即可访问此方法,而 console.log(test.a) 显示未定义,因为 a 已分配给该类的每个新实例。

    希望这至少能澄清一点,如果不清楚,请见谅。

    【讨论】:

      猜你喜欢
      • 2011-10-11
      • 1970-01-01
      • 2023-03-21
      • 2018-09-01
      • 1970-01-01
      • 2012-01-04
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多