JS:如何向对象实例添加方法?

yar*_*rek 2 javascript

这是我的html

    <script src="game.js"></script>
    <script src="help.js"></script>
$(document).ready(function () {
    game = new Game();
    game.start();
})
</script>
Run Code Online (Sandbox Code Playgroud)

游戏.js:

var Game = function() {
    this.start = function() {
        console.log('start');       
    };

};
Run Code Online (Sandbox Code Playgroud)

帮助.js

Game.help = function() {
    alert('help');
}
Run Code Online (Sandbox Code Playgroud)

但是 game.help() 会引发错误

怎么了 ?以及如何解决它?

错误:帮助未定义

ssu*_*ube 5

首先,Game.help将函数附加到函数Game而不是对象的实例Game

也就是说,Game.help = function () { ... }将允许Game.help()但不允许new Game().help()。这相当于大多数 OO 语言中的静态方法。

可以做的但不是很惯用的事情是更改help.js为:

Game.prototype.help = function () {
  ...
}
Run Code Online (Sandbox Code Playgroud)

这会将函数附加为方法,因此 的任何实例都Game可以help()调用它。

不过,从另一个模块(/文件)扩展类的原型有点粗略,因为它添加了隐式依赖项(隐式阻止浏览器强制执行它,当您忘记依赖项并更改看起来的内容时,通常会导致错误无关)。

在 ES7 扩展方法提案最终确定(和 ES7)落地之前,您可能需要考虑使用将其范围作为第一个参数的辅助方法:

help(game, ...) {
  alert('help for ' + game.name);
}
Run Code Online (Sandbox Code Playgroud)

这仍然不太理想,但比较安全。