我是新手,以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
答案 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
指向该空对象。)
该空对象将填充属性:wheels
和color
。
隐式返回该对象。 (如果您有明确的return
语句,则this
的该对象将被丢弃。)
最后,您返回的对象具有以下结构:
{
wheels: 4,
color: 'red'
}