繁体   English   中英

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

[英]Constructor fails on second time, but not first

我有以下代码:

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

为什么这个脚本失败了? 我知道它是与设置FOO到this第2行,而不是仅仅使用this ,但它为什么有问题?

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

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

如果我把self设定为等于this ,那就过去了,为什么会这样呢?

问题出在以下几行

foo = this;

上面的行错过了变量声明。 所以foo将引用全局变量foo ,它是一个构造函数。当你第一次调用该函数时,该行执行并且foo被更改为thisfoo实例)

在第二种情况下,代码还会创建一个全局变量self ,它将与this相等。 但在这种情况下,它不会改变构造函数,因为名称不同。

解决方法是使用let (或const/var )使foo成为局部变量。

 var foo = function () { let foo = this; foo.boo = function () { console.log("boo"); } } var bar = new foo().boo(); var baz = new foo().boo(); 

虽然你已经得到了答案,但你可能不会明确地设置this 如果你在foo函数中使用console.log ,它将记录一个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(); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM