Javascript 有没有办法在原型中使用函数参数作为getter?

Javascript 有没有办法在原型中使用函数参数作为getter?,javascript,parameters,parameter-passing,prototype,getter,Javascript,Parameters,Parameter Passing,Prototype,Getter,我正在尝试编写pacman代码,但a遇到了一个问题: 由于所有的鬼魂都使用相同的寻路方式,并且通常非常相似,所以我想为它们使用一个原型。他们真正不同的唯一属性是他们选择目标位置的方式。我想给原型一个函数,并将其用作getter。可能吗 function Ghost(color,x,y,getterFunction){ this.color = color; this.x = x; this.y = y; this.direction = "up"; thi

我正在尝试编写pacman代码,但a遇到了一个问题: 由于所有的鬼魂都使用相同的寻路方式,并且通常非常相似,所以我想为它们使用一个原型。他们真正不同的唯一属性是他们选择目标位置的方式。我想给原型一个函数,并将其用作getter。可能吗

function Ghost(color,x,y,getterFunction){
    this.color = color;
    this.x = x;
    this.y = y;
    this.direction = "up";
    this.move = function(){
        //Pathfind towards this.target
    }
    this.target = getterFunction; //or something like this...
}

谢谢你的帮助:^)

@Bergi说得对。你不想把它当作一个getter。如果您试图将其添加到原型中,它将被您创建的每个新重影覆盖,因为原型是一个共享对象

原型用于共享功能。实例功能属于实例,即在构造函数中

你的移动功能应该在原型上。但目标应该是一个实例方法。您可以在原型上为target设置默认方法。在查看原型之前,将调用任何实例方法

范例

function Ghost(color, x, y, target){
    // everything in here is instance specific
    this.color = color;
    this.x = x;
    this.y = y;
    this.direction = "up";

    if (typeof target === 'function') {
      this.target = target;
    }
}

// this is the prototype
Ghost.prototype.move = function() {
    //Pathfind towards this.target
    this.target()
}

Ghost.prototype.target = function() {
  // default target to use if no target provided at creation
}
现在,当你这样做的时候:

var redGhost = new Ghost('red', 0, 0, function() {
  //do something unique
})
var yellowGhost = new Ghost('yellow', 0, 0)
你会有一个红色的幽灵,并且有一个自定义的目标函数。但如果你这样做:

var redGhost = new Ghost('red', 0, 0, function() {
  //do something unique
})
var yellowGhost = new Ghost('yellow', 0, 0)

您将拥有一个使用您添加到原型中的默认目标函数的重影。

@Bergi是正确的。你不想把它当作一个getter。如果您试图将其添加到原型中,它将被您创建的每个新重影覆盖,因为原型是一个共享对象

原型用于共享功能。实例功能属于实例,即在构造函数中

你的移动功能应该在原型上。但目标应该是一个实例方法。您可以在原型上为target设置默认方法。在查看原型之前,将调用任何实例方法

范例

function Ghost(color, x, y, target){
    // everything in here is instance specific
    this.color = color;
    this.x = x;
    this.y = y;
    this.direction = "up";

    if (typeof target === 'function') {
      this.target = target;
    }
}

// this is the prototype
Ghost.prototype.move = function() {
    //Pathfind towards this.target
    this.target()
}

Ghost.prototype.target = function() {
  // default target to use if no target provided at creation
}
现在,当你这样做的时候:

var redGhost = new Ghost('red', 0, 0, function() {
  //do something unique
})
var yellowGhost = new Ghost('yellow', 0, 0)
你会有一个红色的幽灵,并且有一个自定义的目标函数。但如果你这样做:

var redGhost = new Ghost('red', 0, 0, function() {
  //do something unique
})
var yellowGhost = new Ghost('yellow', 0, 0)

您将有一个使用您添加到原型中的默认目标函数的重影。

否。如果这是它们的不同之处,则您不希望将其放在原型上。只需使用
this.target()
而不是
this.target
,您的代码应该可以工作。您考虑过使用ES6类吗?您可以使用Babel来传输代码,使其在所有情况下都能工作browsers@royalsampler不管怎样,我都不知道如何在课堂上做到这一点。。。但多亏了巴别塔的提示。。。我不知道这一点。@Bergi我想简单地将其从原型中删除,但这使得不可能一次性初始化对象。之后我需要添加函数。。。但是简单地不使用getter的技巧很好:)Tahnks!不。如果这就是它们的不同之处,那就是您不想在原型上使用的东西。只需使用
this.target()
而不是
this.target
,您的代码就应该可以工作了。您考虑过使用ES6类吗?您可以使用Babel来传输代码,使其在所有情况下都能工作browsers@royalsampler不管怎样,我都不知道如何在课堂上做到这一点。。。但多亏了巴别塔的提示。。。我不知道这一点。@Bergi我想简单地将其从原型中删除,但这使得不可能一次性初始化对象。之后我需要添加函数。。。但是简单地不使用getter的技巧很好:)Tahnks!这是一个很好的答案,但是可以从一些示例代码中受益。现在这个答案太棒了。A+++会再次投票。谢谢:)你的帮助真的很有帮助!但是我有一个问题:将move函数专门添加到原型中有什么区别吗?或者我可以把它放在原处吗?如果你把它放在构造函数中,每个实例都会得到该函数的一个新副本。如果希望通过原型共享,则必须将其添加到原型中。原型是一个单独的对象。每个实例都会获得对原型的引用,因此如果您试图在实例上查找不存在的属性(如move),它会查找原型链以查看是否可以找到该属性。这是一个很好的答案,但可以从一些示例代码中受益。现在这个答案非常棒。A+++会再次投票。谢谢:)你的帮助真的很有帮助!但是我有一个问题:将move函数专门添加到原型中有什么区别吗?或者我可以把它放在原处吗?如果你把它放在构造函数中,每个实例都会得到该函数的一个新副本。如果希望通过原型共享,则必须将其添加到原型中。原型是一个单独的对象。每个实例都会获得对原型的引用,因此如果您试图在实例上查找不存在的属性(例如move),它会查找原型链以查看是否可以找到该属性。