3

よくわかりません。

同じプロトタイプを共有する 2 つのオブジェクトを作成していますが、2 番目のオブジェクトがメソッドを起動すると、共有継承オブジェクト( )run()に設定されているタイムアウトが停止することが期待されます。timerFoo.prototype.timer

の代わりにグローバル変数を使用するようにすべてを変更するとFoo.prototype.timer、これは機能します..

両方のオブジェクトが同じ を共有している場合、クリアされないのはなぜFoo.prototype.timerですか?

function Foo(){
    // generate a random ID to show which object we're on
    this.id = Math.floor(Math.random() * 1000) + 2;
}

Foo.prototype = {
    run : function(){
        var that = this,
            count = 0;

        this.stop();
        function calc(){
            console.log(that.id);
            if( count++ < 20 )
                that.timer = setTimeout( calc, 100 );
        }

        that.timer = setTimeout( calc, 200 );
    },
    stop : function(){
       clearTimeout(this.timer);
    }
}

// initiating

var foo = new Foo();
foo.run();

var bar = new Foo();
bar.run();

(この問題を確認するには、このコードをコピーしてコンソールで実行してください。)

4

2 に答える 2

0

どうすればユニークにしないのですか?ユニークなものは Foo() 自体にのみあると思いました

で宣言するthisものは、プロトタイプ内で宣言されている場合でも、インスタンスに固有のものになります。共有されるのは、各オブジェクトのプロパティではなくプロトタイプです。

グローバル変数の代わりにモジュールを試してみてください。そうすれば、変数をプライベートで共有することができます。

var Foo = (function FooClass() {

  var timer;

  function Foo() {
    ...
  }

  Foo.prototype = {
    ...
  };

  return Foo;

}());
于 2013-01-30T21:59:05.237 に答える
0

ではthat.timer、プロトタイプに割り当てません -thatはインスタンスであるため、そこに新しいプロパティが作成されます。プロトタイプにプロパティを設定するには、明示的に行う必要があります。

Foo.prototype.timer = setTimeout( calc, 200 ); // or, more verbose:
Object.getPrototypeOf(that).timer = setTimeout( calc, 200 );
于 2013-01-30T22:10:04.537 に答える