原型继承javascript使用不同功能的变量

时间:2016-01-31 10:41:38

标签: javascript prototypal-inheritance

我正在制作一个Hangman游戏来提高我对原型继承的认识。

我完全混淆为什么在原型函数中看不到变量this.guesses。我试着玩弄我能想到的每一种不同的组合。

我的代码如下:

function Hangman () {
    this.token;
    this.guesses = 7;
}

Hangman.prototype.startGame = function() {
    $.ajax({
            url:"http://hangman-api.herokuapp.com/hangman",
            type: "POST",
            data: {}
        }).done(function(data) {
            console.log(data);
            Hangman.token = data.token;
            $(".hangman-word").text(data.hangman);
        }).fail(function() {
        alert( "error" );
    });
};

Hangman.prototype.takeGuess = function(token, letter){
    var letter = $("#letter").val();
    $.ajax({
        url:"http://hangman-api.herokuapp.com/hangman",
        type:"PUT",
        data: {"token": Hangman.token, "letter": letter }
    }).done(function(data) {
            Hangman.guesses = Hangman.guesses - 1;
            console.log(Hangman.guesses)
        }).fail(function() {
        alert( "error" );
    });
        console.log(Hangman.token);     
}


var hangman = new Hangman;
hangman.startGame();

真正奇怪的是,Hangman.token功能中takeGuess可见,Hangman.guesses则不可见OpenTSDB does not support more than 8 tags. and it is not configurable. 。任何人都可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

guesses成员是实例成员,您无法将其称为静态成员。

该成员在构造函数中声明,因此,它仅作为this.guesses提供。

Hangman.token存在,因为您将其声明为startGame成员的静态成员...

我认为您的脚本中存在一些不一致之处...我会尝试通过一个解释您在javascript中静态实例成员之间的差异例如:

  

考虑到使用ES6 specification,类的实现有点不同。

在类似javascript类的编程中,prototype对象上声明的每个成员都应该假定为instance member,因此,该类的每个实例都将继承这些成员。

var Person = (function() {
  function Person() {}

  Person.prototype.sayHello = function() { alert('Hello ' + this.name ); };
  Person.prototype.name = 'Foo';

  
  return Person;
})();

var hitmands = new Person();
hitmands.sayHello();

否则,从原型对象外部声明的每个成员将被假定为static member

var Person = (function() {
  function Person() {}

  Person.sayHello = function() { alert('Hello ' + Person.name ); };
  Person.name = 'Foo';

  
  return Person;
})();

var hitmands = new Person();

try { hitmands.sayHello(); } catch(e) { console.log(e.name, e); }

// but you can use
Person.sayHello();

最后,我建议您查看此资源https://en.wikipedia.org/wiki/Member_variable