2012-01-17 9 views
8

私は現在のJavaScriptグッド部」を読んでいて、私たちはオブジェクトのプロパティ値を取得しようとした場合、私は、次の段落プロトタイプの継承を使用するjavascriptコードのオブジェクトの有効期間はどのくらいですか?

に出くわした、と オブジェクトは、その後、JavaScriptの試みをプロパティ名がない場合プロトタイプオブジェクトからプロパティ値 を取得します。そのオブジェクトが にプロパティがない場合は、そのプロトタイプに移動します。 までは、最後にObject.prototypeでプロセスが終了します。

私はプロトタイプとしてOBJ1からオブジェクトOBJ2を作成した場合、それはOBJ2もスコープから出るまでOBJ1を破壊することはできません意味ですか?

+0

JavaScriptエンジンがプロトタイプをどのように実装しているかは本当に分かりませんが、オブジェクトへの参照**のようには思えません。これは継承メカニズムに似ていますので、obj1のインスタンス**がobj2が存在するために必要な場合は驚きます。 –

答えて

5

オブジェクトの継承(プロトタイプのリンク)を構築している限り、ブラウザはそのオブジェクトへの参照に依存しているとは思われません。

EX1:

var a = function(){}; 
a.prototype.toString = function(){return "I'm an A!";}; 
var b = new a(); 
a = undefined; 
var c = new a();// error => a is not a function any more! 
b.toString();// it works because the prototype is not destroyed, 
      // only our reference is destroyed 

EX2:

var a = function(){}; 
a.prototype.toString = function(){return "I'm an A!";}; 
var b = function(){}; 
b.prototype = new a(); 
a = undefined; 
var c = new b(); 
console.log(c+'');// It still works, although our 
        // initial prototype `a` doesn't exist any more. 

UPDATE: この動作はJavaScriptにあなたが正確にオブジェクトを破壊することができないという事実に関係している可能性があります;すべての参照を削除することしかできません。その後、ブラウザーは参照されていないオブジェクトを対処する方法をGarbage collectorで決定します。

+1

Hmは、 'b.prototype'と同じように' a'だけそのオブジェクトへの参照ではありませんでしたか?まだ参照があるようです。 – kapa

+0

'b.prototype'は' a'の**インスタンス**です。 (newキーワードを感じる) –

+0

** name ** 'b.prototype'は確かに**参照**です。' new a() 'はオブジェクトへの無名の参照を返します。 'b.prototype'のような名前付きリファレンスを使用したり、一度しか使用できなかったりすると、それがアクセス不能になりました(文字通り範囲外になります)。 – zuba

関連する問題