gpt4 book ai didi

javascript - 类仿真中的 JS 和方法

转载 作者:太空宇宙 更新时间:2023-11-04 15:17:08 24 4
gpt4 key购买 nike

我是新手,所以我会尽量详细。

我正在使用函数创建一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com