我可以访问 JavaScript 中对象的 this 吗?
Can I access this of an object in JavaScript?
var b = {
state: 'initial',
initial: {
onClick: function() {
console.log(this);
},
x: 0,
},
}
嗨,我想知道是否可以在上面的代码中访问 onClick 函数中的 b 对象?
输出是 {x: 0, onClick: ƒ}
而不是 {state: 'initial', ... }
将其更改为箭头函数将改为输出 window 对象。
我正在制作一款密室逃脱游戏,有点像先有鸡还是先有蛋的情况。
var spriteObject =
{
img: null,
INITIAL: {
sourceX: 0,
sourceY: 0,
sourceWidth: 64,
sourceHeight: 64,
x: 0,
y: 0,
width: 64,
height: 64,
isWithinBounds: function(x, y) {
return x > this.x && x < this.x + this.width && y > this.y && y < this.y + this.height;
},
},
state: 'INITIAL',
};
const inventoryItems = [];
let currentRoom = "kitchen";
const knife = {
...spriteObject,
INITIAL: {
...spriteObject.INITIAL,
x: 200,
y: 162,
sourceX: 1330,
sourceY: 8,
sourceWidth: 803,
sourceHeight: 514,
width: 803,
height: 514,
onClick: () => {
inventoryItems.push(knife);
layers.kitchen.sprites = layers.kitchen.sprites.filter(sprite => sprite !== knife);
},
},
img: kitchenLayout,
};
const layers = {
kitchen: {
sprites: [knife],
},
};
window.addEventListener("click", function(e) {
const x = e.pageX - canvas.offsetLeft;
const y = e.pageY - canvas.offsetTop;
layers[currentRoom].sprites.forEach(sprite => {
const currSprite = sprite[sprite.state];
if (currSprite.onClick && currSprite.isWithinBounds(x, y)) {
currSprite.onClick();
render();
}
})
})
假设我有一间厨房,柜台上有一把刀。我可以拿起刀并将其放入我的库存中。这把刀有 3 种不同的情况:在柜台上(初始)、在库存中和钝了(使用后)。我不确定我是否想在库存中建模为一个状态,但我很难弄清楚如何从厨房的精灵列表中删除刀。它在上面的代码中是可行的,但它似乎依赖于我将 knife 声明为变量这一事实。我不想这样做,以防我想直接在 sprites 数组上声明我的项目。感谢任何提示,谢谢
您应该可以使用 javascript classes 来完成此操作。这样您就可以将当前的 class 引用为 this
.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
var b = {
state: 'initial',
initial: {
onClick: function() {
console.log(this);
},
x: 0,
},
}
嗨,我想知道是否可以在上面的代码中访问 onClick 函数中的 b 对象?
输出是 {x: 0, onClick: ƒ}
而不是 {state: 'initial', ... }
将其更改为箭头函数将改为输出 window 对象。
我正在制作一款密室逃脱游戏,有点像先有鸡还是先有蛋的情况。
var spriteObject =
{
img: null,
INITIAL: {
sourceX: 0,
sourceY: 0,
sourceWidth: 64,
sourceHeight: 64,
x: 0,
y: 0,
width: 64,
height: 64,
isWithinBounds: function(x, y) {
return x > this.x && x < this.x + this.width && y > this.y && y < this.y + this.height;
},
},
state: 'INITIAL',
};
const inventoryItems = [];
let currentRoom = "kitchen";
const knife = {
...spriteObject,
INITIAL: {
...spriteObject.INITIAL,
x: 200,
y: 162,
sourceX: 1330,
sourceY: 8,
sourceWidth: 803,
sourceHeight: 514,
width: 803,
height: 514,
onClick: () => {
inventoryItems.push(knife);
layers.kitchen.sprites = layers.kitchen.sprites.filter(sprite => sprite !== knife);
},
},
img: kitchenLayout,
};
const layers = {
kitchen: {
sprites: [knife],
},
};
window.addEventListener("click", function(e) {
const x = e.pageX - canvas.offsetLeft;
const y = e.pageY - canvas.offsetTop;
layers[currentRoom].sprites.forEach(sprite => {
const currSprite = sprite[sprite.state];
if (currSprite.onClick && currSprite.isWithinBounds(x, y)) {
currSprite.onClick();
render();
}
})
})
假设我有一间厨房,柜台上有一把刀。我可以拿起刀并将其放入我的库存中。这把刀有 3 种不同的情况:在柜台上(初始)、在库存中和钝了(使用后)。我不确定我是否想在库存中建模为一个状态,但我很难弄清楚如何从厨房的精灵列表中删除刀。它在上面的代码中是可行的,但它似乎依赖于我将 knife 声明为变量这一事实。我不想这样做,以防我想直接在 sprites 数组上声明我的项目。感谢任何提示,谢谢
您应该可以使用 javascript classes 来完成此操作。这样您就可以将当前的 class 引用为 this
.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes