You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构造函数中赋值this报错:Invalid left-hand side in assignment

构造函数中赋值this报错的解决办法

问题场景

我尝试创建游戏玩家对象,最初的写法如下:

let player = game.add.sprite(100, 100, 'player');
player.speed = 4;
player.gravity = 1;

随后改写为构造函数形式时,触发语法错误:

let player = new Player(100, 100);

function Player(x, y) {
  this = game.add.sprite(x, y, 'player');
  this.speed = 4;
  this.gravity = 1;
}

报错信息:Uncaught SyntaxError: Invalid left-hand side in assignment

原因

在JavaScript的构造函数中,this是由new关键字自动生成的对象引用,语法上不允许直接给this赋值,这是语言本身的限制。

解决方法

方法1:用Object.assign合并自定义属性

直接将自定义属性合并到game.add.sprite返回的精灵对象上,构造函数最终返回该对象即可:

function Player(x, y) {
  const sprite = game.add.sprite(x, y, 'player');
  Object.assign(sprite, {
    speed: 4,
    gravity: 1
  });
  return sprite;
}

// 使用方式不变
let player = new Player(100, 100);

注:这种写法下,即使不用new关键字调用Player函数,也能正常生成玩家对象。

方法2:ES6类继承Sprite(推荐引擎适配场景)

如果项目支持ES6+语法,可以让Player类直接继承游戏引擎的Sprite类,这样this会正确指向Sprite实例:

class Player extends game.add.sprite.constructor {
  constructor(x, y) {
    // 调用父类构造函数创建Sprite实例
    super(x, y, 'player');
    // 添加自定义属性
    this.speed = 4;
    this.gravity = 1;
    // 部分引擎需要手动将实例添加到场景中
    game.add.existing(this);
  }
}

let player = new Player(100, 100);

方法3:使用工厂函数(最简洁)

放弃构造函数,直接用普通函数封装玩家对象的创建逻辑:

function createPlayer(x, y) {
  const player = game.add.sprite(x, y, 'player');
  player.speed = 4;
  player.gravity = 1;
  return player;
}

// 调用生成玩家对象
let player = createPlayer(100, 100);

内容的提问来源于stack exchange,提问作者coolidenticon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:55:19