我对此很陌生,所以我会尽力尽可能详细。
我正在使用函数创建一个 JS 类。
function Bandstar(p, id)
{
var numberOfSides, Xcenter, Ycenter;
var canvas;
var circlesInt;
var linesInt;
var lines;
var linesInt2;
var linesMidToEdge;
.....
当涉及到方法时,我只是这样声明它们:
this.IAset = function(a)
{
for (var i =0; i<= this.numberOfSides-1;i++)
{
if (parseInt(a[i]) == a[i])
this.circles[i].value = a[i];
else
return false;
}
this.IArepaint();
return true
}
差不多就是这样了。
现在的问题是,当我创建特定方法时:
this.moveFunc = function(e)
{
var p = e.target;
this.IAmove(p);
};
方法 IAmove
声明如下:
this.IAmove = function(p)
{
var m = (p.oTop - this.Ycenter ) / (p.oLeft - this.Xcenter);
var linea = m * ( p.left - p.oLeft) + p.oTop;
var ejeX = p.left;
...
}
编译器不断抛出此错误:
Uncaught TypeError: Object function (e) { var p = e.target; this.IAmove(p); } has no method 'IAmove'
所以,问题是我将 moveFunc
声明为一个函数,但是当我尝试使用 this
属性时,它实际上并没有使用该实例它上面的类 (Bandstar
),但它本身(显然 moveFunc
没有名为 IAmove
的方法,该类它正在创建的是)...
我认为这就像它的工作原理一样,但我一定没有正确理解 JS 中的继承和类形态的概念。
如何从同一类中的另一个方法访问类中的方法?如果我只写 IAmove(p)
它只会说方法 IAmove()
未定义(因为它不是,它是 Bandstar 命名空间的一部分。
我知道这一定是一些我没有看到的愚蠢的事情。有什么建议吗?
最佳答案
函数内的上下文可能会根据您的调用而改变。所以 this
不可能是原始对象。
您应该添加一个私有(private)变量,例如:
function Bandstar(p, id)
{
var numberOfSides, Xcenter, Ycenter;
var canvas;
var that = this; // add this line
并在尝试调用原始对象的函数(或获取属性)时使用它
this.moveFunc = function(e)
{
var p = e.target;
that.IAmove(p); // change this line
};
确保指向原始对象。
编辑:根据评论,您可以在 Stuart's answer 中阅读更多信息
关于javascript - 类模拟中的 JS 和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14154625/