我想了解闭包。在下面的代码中,我创建了构造函数Ninja
的实例,并调用实例kawazaki
。我希望能够访问Ninja
的方法。但是,我得到的是TypeError: Object #<Ninja> has no method 'feints'
。
我预期的输出是1
。
这是我的代码:
function Ninja() {
var feints = 0;
function getFeints() {
return feints;
}
function feints() {
feints++;
}
}
var kawazaki = new Ninja();
kawazaki.feints();
console.log(kawazaki.getFeints());
答案 0 :(得分:2)
请改为尝试:
var kawazaki = new Ninja;
kawazaki.feints();
alert(kawazaki.getFeints());
function Ninja() {
var feints = 0;
this.getFeints = function () {
return feints;
};
this.feints = function () {
feints++;
};
}
&#13;
您需要在构造函数中将公共属性赋予this
。
答案 1 :(得分:0)
函数getFeints
和feints
的范围仅限于函数Nija。由于无法访问函数中声明的变量,因此无法访问这些函数。
为了能够执行kawazaki.feints()
,您必须&#34;附加&#34; Ninja函数的函数,作为一个对象(函数也是)
您将在这些资源中找到实现这一目标的几种方法,以及一些更深入的解释:
答案 2 :(得分:0)
关闭是一个非常简单但很大程度上被误解的话题。
function Ninja() {
var feints = 0;
function getFeints() {
return feints;
}
function feintsInc() {
feints++;
}
}
您已经定义了闭包,但请注意闭包实际上并不是对象的方法。为了获得所需的输出,您需要在关闭对象之前调用闭包。
feintsInc();
getFeints();
但是,如果你想这样做
kawazaki.feintsInc();
您需要在函数中使用this
个关键字来获取分配给对象的函数。
Note,make sure your functions and variable names don't overlap.