所以,我有这种代码结构:
var player;
function Player(lives) {
this.lives = lives;
}
function init() {
player = new Player(player.lives || 3);
}
init(); // Doesn't work, 3 lives
player.lives--;
init(); // Will work, 2 lives
player.lives--;
init(); // Will work, 1 lives
player.lives--;
init(); // Will work, 3 lives
所以有2个选项;
1:无论如何都要做一个新的"可以保留某些值的函数吗?
2:有没有比这样做更快的方法:
function init() {
player = new Player((player == "undefined" ? 0 : player.lives) || 3)
}
答案 0 :(得分:1)
更新:好的,我的理解是:
你总是想创建一个新玩家,即使你已经有一个(这对我来说有点奇怪)
如果player.lives
到达0
,您想再次从3
开始
数目:
1:无论如何都要做一个新的"可以保留某些值的函数吗?
将构造函数("' new'函数")绑定到特定的对象实例,这将破坏具有构造函数的目的。你可以传入一个前一个对象作为可选参数,但我不会在那个级别执行它,我会在构造函数之外处理它。
但仅仅是为了完整性:
function Player(lives, player) {
this.lives = (player ? player.lives : lives) || lives;
}
有时你会看到这个变种,我不会因为临时对象而成为粉丝:
function Player(lives, player) {
this.lives = (player || {lives: lives}).lives || lives;
}
无论哪种方式,你都这样使用它:
function init() {
player = new Player(3, player);
}
如果你没有传递第二个论点,或者你传递了一个假的,或者它没有假,它没有lives
属性,或者它不是假的,它有一个lives
属性,但该属性是假的,你将使用第一个参数。否则,它将成为第二个参数的lives
属性。
2:有没有比这样做更快的方法:
不确定你的意思"更快,"但你可以相当简洁:
function init() {
player = new Player(player ? (player.lives || 3) : 3);
}
当然还是那个临时对象:
function init() {
player = new Player((player || {lives: 3}).lives || 3);
}