3

我很困惑。

我正在创建 2 个共享相同原型的对象,但是当第二个对象触发该run()方法时,我希望它停止在共享继承对象timer( Foo.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 回答