构造函数第二次失败,但第一次失败

时间:2019-06-10 13:54:51

标签: javascript node.js constructor this instance

我有以下代码:

var foo = function () {
    foo = this;
    foo.boo = function () {
        console.log("boo");
    }
}

var bar = new foo().boo();
var baz = new foo().boo();

此代码执行foo实例的第一次创建,但第二次失败,并显示以下输出:

boo
/Users/BaranSkistad/Code/example.js:9
var baz = new foo().boo();
          ^

TypeError: foo is not a constructor
    at Object.<anonymous> (/Users/BaranSkistad/Code/example.js:9:11)
    at Module._compile (module.js:573:30)
    at Object.Module._extensions..js (module.js:584:10)

    at Module.load (module.js:507:32)
    at tryModuleLoad (module.js:470:12)
    at Function.Module._load (module.js:462:3)
    at Function.Module.runMain (module.js:609:10)
    at startup (bootstrap_node.js:158:16)
    at bootstrap_node.js:578:3

为什么该脚本失败?我知道这与在第2行上将foo设置为this有关,而不仅仅是使用this,但是为什么会有问题?

var foo = function () {
    self = this;
    self.boo = function () {
        console.log("boo");
    }
}

var bar = new foo().boo();
var baz = new foo().boo();

如果我将self设置为等于this,它会通过,为什么会这样?

2 个答案:

答案 0 :(得分:3)

问题在以下行

y

上面的行缺少变量声明。因此foo = this; 将引用作为构造函数的全局变量foo。当您首次调用该函数时,该行将执行,并且foo会更改为foothis

在第二种情况下,代码还将创建一个全局变量foo,该变量将等于self。但是在那种情况下,因为名称不同,它不会更改构造函数。

解决方案是使用this(或foo)使let成为局部变量。

const/var

答案 1 :(得分:0)

尽管您已经有了答案,但是您可能未明确设置this。如果您在console.log函数内foo,它将记录一个object。相反,您可以return和一个object,它将具有所有内部功能

var foo = function() {
  return {
    testVal: 5,
    boo: function() {
      console.log("boo ", this.testVal);
    }
  }
}

var bar = new foo().boo();
var baz = new foo().boo();