Javascript - 原型(prototype)函数数组

标签 javascript jquery html

我是一个 javascript 新手,所以到目前为止,由于我缺乏经验以及它与我习惯的语言有多么不同,所以到目前为止我写的代码很难看,所以我将在下面发布的代码有效,但是我想知道我是否以正确的方式做这件事,或者它是否有效,但这是一种可怕的做法,或者有更好的方法。

基本上,我有一个在网格内移动的小家伙,他从服务器接收到一个 Action ,他可以​​在 8 个方向(int)上移动:0:向上,1:右上,2:右...... 7:左上。

服务器将向他发送这个 0 <= action <= 7值(value),他必须采取正确的行动......现在,而不是使用开关案例结构。我创建了一个函数 goUp()、goLeft() 等,并将它们加载到一个数组中,所以我有一个这样的方法:

var getActionFunction = actions[action];
actionFunction();

但是,要设置这一切的是:

1) 创建一个构造函数:

function LittleDude(container) {
    this.element = container; //I will move a div around, i just save it in field here.
}

LittleDude.prototype.goUp() {
    //do go up
    this.element.animate(etc...);
}

LittleDude.prototype.actions = [LittleDude.prototype.goUp, LittleDude.prototype.goUpLeft, ...];
//In this array I can't use "this.goUp", because this points to the window object, as expected

LittleDude.prototype.doAction = function(action) {
    var actionFunction = this.actions[action];
    actionFunction(); //LOOK AT THIS LINE
}

现在如果你注意的话,最后一行将不起作用..因为:当我使用索引访问数组时,它返回一个 LittleDude.prototype.goUp 例如...所以“this”关键字是未定义..

goUp有一个声明“this.element”...但是“this”没有定义,所以我必须这样写:

actionFunction.call(this);

所以我的 doAction 看起来像这样:

LittleDude.prototype.doAction = function(action) {
    var actionFunction = this.actions[action];
    actionFunction.call(this); //NOW IT WORKS
}

我需要知道这是否有问题,或者我是否违反了某种“请勿这样做”的规则。或者它可以用更好的方式编写。因为在我看来,将它添加到原型(prototype)中但随后将其视为一个独立的函数似乎有点奇怪。

最佳答案

您尝试做的是其中一种可能的方法,但可以使其更简单。由于对象属性名称不是必需的字符串,您可以直接在原型(prototype)上使用 Action 索引。您甚至不需要 doAction 函数。

LittleDude = function LittleDude(container) {
  this.container = container;
}

LittleDude.prototype[0] = LittleDude.prototype.goUp = function goUp() {
  console.log('goUp', this.container);
}

LittleDude.prototype[1] = LittleDude.prototype.goUpRight = function goUpRight() {
  console.log('goUpRight', this.container);
}

var littleDude = new LittleDude(123),
    action = 1;
littleDude[action](); // --> goUpRight 123
littleDude.goUp(); // --> goUp 123

关于Javascript - 原型(prototype)函数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15812167/

相关文章:

html - 如何对齐 CSS 导航栏中间的元素?

jquery - 如何在预制图库中自动调整照片大小?

JavaScript 和 DOM : Why "<table>" += "<tr><td></td></tr>" += "</table" doesn't work?

javascript - 当 jQuery 选择器保存在变量中时,如果元素删除,如何知道删除

javascript - document.documentElement.scrollTop 返回值在 Chrome 中有所不同

javascript - 将更改推送到网页而不刷新

javascript - 如何使用javascript将div内容替换为 "html content"?

javascript - 是否可以分段运行循环? - JavaScript

javascript - javascript 获取什么样的属性?

php - 如何使用 PHP 在我的下拉菜单中仅显示具有相同 page_id 的元素?如何在 foreach 循环中编写 'if' 语句?