Javascript ||具有未定义对象属性的门

时间:2014-06-16 15:19:30

标签: javascript html5 new-operator

所以,我有这种代码结构:

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)
}

1 个答案:

答案 0 :(得分:1)

更新:好的,我的理解是:

  1. 你总是想创建一个新玩家,即使你已经有一个(这对我来说有点奇怪)

  2. 如果player.lives到达0,您想再次从3开始

  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);
    }