原型继承JavaScript在不同函数中使用变量

Prototypal inheritance javascript using variables in different functions

本文关键字:变量 函数 继承 JavaScript 原型      更新时间:2023-09-26

我正在制作一个刽子手游戏,以提高我对原型遗传的了解。

我完全困惑为什么变量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.tokentakeGuess函数中可见,但Hangman.guesses不是。谁能解释为什么会发生这种情况?

guesses成员

实例成员,不能将其称为静态成员。

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

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

我认为您的脚本中存在一些不一致之处...我将尝试通过一个例子来解释javascript中静态成员和实例成员之间的区别:

考虑到 ES6 规范,类的实现有点不同。

在类似 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