为什么`this`总是在构造函数中的`Window`对象?

时间:2013-10-20 16:25:15

标签: javascript

我有这段代码:

(function() {

  function App(elements, options) {

    if (!this instanceof App) return new App(elements, options);

    var that = this;

    return this;

  }

  window.App = App;

})();

App(document.querySelectorAll('.Slider-slide'), {
  interval: 5000
});

我的问题是,它永远不会创建App的新实例,所以,this代码下面的Window始终是{{1}}对象,任何想法为什么??

2 个答案:

答案 0 :(得分:6)

你的if条件是问题:

if (!this instanceof App)

应该是:

if (!(this instanceof App))

查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table

答案 1 :(得分:0)

如Musa的回答所述

更新,可以使用以下两种模式中的任何一种来纠正代码:

(function() {

  function App(elements, options) {

    if (!(this instanceof App)) return new App(elements, options);

    var that = this;

  }

  window.App = App;

})();

var myapp = App(document.querySelectorAll('.Slider-slide'), {
  interval: 5000
});

class结构不需要new调用:

(function() {
    function App(elements, options) {
        var that = this;
    }

    //calling window.App(/*stuff*/) will always return a new class
    window.App = function(elements, options) {
        return new App(elements, options);
    };
})();

一个小注意事项 - 当你创建一个类时,你不需要返回它,因为这是隐式处理的。