在创建新对象/类时,闭包可以使用new关键字以及有什么区别

时间:2016-01-02 11:16:18

标签: javascript

我是新手,以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

4 个答案:

答案 0 :(得分:4)

这与闭包无关。

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

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

答案 1 :(得分:2)

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

你当前的功能绝对正常,只需在new之前调用即可。 (因为它不是构造函数 - 你用new调用的函数 - 你按照约定用小写字母开头,而不是大写字母。所以rankingManage。)

如果您希望在调用new时需要RankingManage,则可以使用new通过this关键字创建的对象:< / p>

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创建的对象的引用。

但同样,你现有的功能还不错。

答案 2 :(得分:1)

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

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/

答案 3 :(得分:1)

假设我们有以下功能:

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

new运营商的确如何(new Car('red');)可以说明如下:

  • 创建一个空对象,并使函数内的this指向。
  • 调用该功能。 (请注意,this指向该空对象。)

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

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

最后,您返回的对象具有以下结构:

{
    wheels: 4,
    color: 'red'
}