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
是没有意义的
您当前的函数非常好,只需将其称为wihtoutnew
。(由于它不是一个构造函数-一个用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
也没有意义。现在有意义了吗?