js変な質問



先日javaeyeで1篇の招待状を见ました:【JS最適化シリーズ】一つのタイマーの書き方からjsの多様な実現方式の優劣を検討する、ビルの主人が确かにすごいと感じて、1つのタイマーはそんなに优雅な书き方があって、その上すべて対象に向かう思想で、私は丸1日かけてあれらの书き方をすべて消化して、あれらの残した評論を见て、javaeyeの上で确かに人材が辈出していることを発见して、道理で先輩がcsdnからjavaeyeにブログを移したわけだ.ここで私が発見した奇妙な問題を貼って、牛が私の困惑を解くことができることを望んでいます.
投稿の「コード6」は次のとおりです.
 
function Timer(id){  
    this.id = id;  
    this.timer = null;  
    this.count = 0;  
}  
Timer.prototype = {  
    begin : function(count){  
        this.count = count;  
        this.show(this)();//      Timer.show(this)();  
        this.timer = setInterval(this.show(this),1000);//      Timer.show(this)();  
    },  
    show : function(obj){     
        return function(){  
            if(obj.count < 0){  
                document.getElementById(obj.id).innerHTML = "over";  
                clearInterval(obj.timer);  
                return ;  
            }  
            document.getElementById(obj.id).innerHTML = obj.count;  
            obj.count--;  
        }  
    }   
}  

 
このコードには何の問題もなく、実行結果はすべて正常ですが、「Timer.prototype={」という行と後の行をTimerコンストラクション関数の内部に移動すると、firebugの下に「t 1.begin is not a function」というエラーが表示されます.
 
<body>  
<div id="time1">time1</div>  
<div id="time2">time2</div>  
</body>  
<script>  
function Timer(id){  
    this.id = id;  
    this.timer = null;  
    this.count = 0;  
	Timer.prototype = {
		begin : function(count){  
			//alert(this);
			this.count = count;  
			this.show(this)();//      Timer.show(this)();  
			this.timer = setInterval(this.show(this),1000);//      Timer.show(this)();  
		},  
		show : function(obj){     
			return function(){  
				if(obj.count < 0){  
					document.getElementById(obj.id).innerHTML = "over";  
					clearInterval(obj.timer);  
					return ;  
				}  
				document.getElementById(obj.id).innerHTML = obj.count;  
				obj.count--;  
			}  
		}  
	};
}

		
t1 = new Timer("time1");  
t2 = new Timer("time2");

t1.begin(10);  
t2.begin(10);  
</script>

そして、「コード7」を見ると、すべてTimerを使っています.prototype.ベンとティマーprototype.ショーは中に書いても実行できます.
function Timer(id){  
    this.id = id;  
    this.timer = null;  
    this.count = 0;  
    Timer.prototype.begin = function(count){  
        this.count = count;  
        this.show(this)();//      Timer.show(this)();  
        this.timer = setInterval(this.show(this),1000);//      Timer.show(this)();  
    }  
    Timer.prototype.show = function(obj){     
        return function(){  
            if(obj.count < 0){  
                document.getElementById(obj.id).innerHTML = "over";  
                clearInterval(obj.timer);  
                return ;  
            }  
            document.getElementById(obj.id).innerHTML = obj.count;  
            obj.count--;  
        }  
    }   
}  
 
どうしてこんなに変なのか分からないが、私の帖がレンガを投げて玉を引く効果を果たすことを望んでいる.大牛たちの素晴らしい解答を期待します!