Javascript closure可以使用new关键字和what is difference,例如,在创建新对象/类时

Javascript closure可以使用new关键字和what is difference,例如,在创建新对象/类时,javascript,Javascript,我是新来的,正在努力。在结束时。我可以用new关键字创建对象,而不使用new关键字,它是如此的怪异me 此处代码:- function RankingManage(rank) { var rank = rank; function rankInc() { rank++; } function rankDec()

我是新来的,正在努力。在结束时。我可以用
new
关键字创建对象,而不使用
new
关键字,它是如此的怪异me

此处代码:-

          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

这与闭包无关

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


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

,因为您正在创建和返回一个对象(使用
return{…}
),通常不会通过
new
调用
rankingmanager
。您没有使用
new
操作符创建的对象,而是通过从函数返回非
null
对象来覆盖
new
表达式的默认结果。因此,这两种方法都是可行的,但在当前编写的函数中使用
new
是没有意义的

您当前的函数非常好,只需将其称为wihtout
new
。(由于它不是一个构造函数-一个用
new
调用的函数-按照惯例,你可以用小写字母开始,而不是大写字母。因此
rankingmanager

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

function RankingManage(rank) {
    var rank = rank;

    function rankInc() {
        rank++;
    }

    function rankDec() {
        rank--;
    }

    this.makeInc = rankInc;
    this.makeDec = rankDec;
    this.showRank = function() {
        return rank;
    };
}
在这种情况下,我们不使用
返回
,因为
new RankingManage
表达式的默认结果是对
new
创建的对象的引用


但是,您现有的函数也很好。

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

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
阻止向
窗口添加值的默认行为,并将它们添加到返回的对象中


jsIDLE:

假设我们有以下函数:

function Car(color){
    this.wheels = 4;
    this.color = color;
}
new
操作员的具体操作(
newcar('red');
)如下所示:

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

  • 该空对象将填充属性:
    wheels
    color

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

最后,返回的对象是以下结构:

{
    wheels: 4,
    color: 'red'
}

这可能会回答您的问题:这里闭包的可能副本是允许您定义变量和函数,而无需它们进入全局名称空间。这里的
new
没有任何用处,因为
rankingmanager
在使用带有obj语法的return in closure时返回一个object
{}
它已经为您创建了一个新对象,再使用
new
也没有意义。现在有意义了吗?