【问题标题】:closure can use new keyword and what is difference for instance, when creating a new object/class闭包可以使用 new 关键字,例如,在创建新对象/类时有什么区别
【发布时间】:2016-01-02 19:50:41
【问题描述】:

我是新手,正在使用 javascript。在关闭的时候。我可以使用new 关键字创建对象,而无需new 关键字,这太奇怪我了。

这里的代码:-

          function RankingManage(rank) {
                var rank = rank;
                function rankInc() {
                    rank++;
                }
                function rankDec() {
                    rank--;
                }

                return {
                    makeInc: function () {
                        rankInc();
                    },
                    makeDec: function () {
                        rankDec();
                    },
                    showRank: function () {
                        return rank;
                    }
                }
            }

            var Rank = new RankingManage(80);
            var Rank2 = RankingManage(80);
            Rank.makeInc();
            Rank2.makeInc();
            console.log(Rank.showRank());//Output:- 81
            console.log(Rank2.showRank());//Output:- 81

【问题讨论】:

标签: javascript


【解决方案1】:

这与闭包无关。

使用new 将函数的this 的值设置为一个新对象,并使其默认返回this

您正在使用return 语句显式返回一个对象,因此您返回该对象而不是this

【讨论】:

    【解决方案2】:

    因为您正在创建并返回一个对象(使用return { ... }),所以您通常不会通过new 调用RankingManage。您没有使用new 运算符创建的对象,而是通过从函数返回非null 对象来覆盖new 表达式的默认结果。所以这两种方式都有效,但是将new 与当前编写的函数一起使用是没有意义的。

    您当前的功能绝对没问题,只需在不带new 的情况下调用它。 (而且由于它不是构造函数——你用new 调用的函数——按照惯例,你应该以小写字母开头,而不是大写字母。所以rankingManage。)

    如果你想在调用RankingManage时需要new,你可以使用new通过this关键字创建的对象:

    function RankingManage(rank) {
        var rank = rank;
    
        function rankInc() {
            rank++;
        }
    
        function rankDec() {
            rank--;
        }
    
        this.makeInc = rankInc;
        this.makeDec = rankDec;
        this.showRank = function() {
            return rank;
        };
    }
    

    我们不使用return,因为(再次)new RankingManage 表达式的默认结果是对new 创建的对象的引用。

    但同样,您现有的功能很好。

    【讨论】:

      【解决方案3】:

      通常,当您以这种方式定义对象时,事情会有所不同。

      public function MyObject(value) {
          this.value = value;
          this.doSomething = function() { console.log("Hello!"); };
      }
      
      var myObject = new MyObject(10);
      var notObject = MyObject(10);
      
      myObject.doSomething(); // Prints Hello!
      notObject.doSomething(); // Prints out "can not get property of undefined"
      

      您现在将看到行为发生了变化,因为 new 阻止了将值添加到 window 并将它们添加到返回的对象的默认行为。

      JSFiddle:https://jsfiddle.net/LLx3376n/

      【讨论】:

        【解决方案4】:

        假设我们有以下函数:

        function Car(color){
            this.wheels = 4;
            this.color = color;
        }
        

        new 运算符的作用(new Car('red');)可以表述如下:

        • 创建一个空对象并让函数内部的this指向。
        • 调用函数。 (注意this 指向那个空对象)。

        • 该空对象将填充属性:wheelscolor

        • 隐式返回该对象。 (如果你有明确的return 语句,this 的那个对象将被丢弃。)

        最后,你返回的对象是这样的结构:

        {
            wheels: 4,
            color: 'red'
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-01
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 2016-05-14
          相关资源
          最近更新 更多