2010-11-23 14 views
0
<HTML> 
    <HEAD> 
     <SCRIPT LANGUAGE="JavaScript"> 
     function Peon(number) { 
      this.number = number; 

      this.inc = function() { 
       number=number+1; 
      }; 

      return true; 
     } 
     var p=new Peon(10); 

     function returnNumber() { 
      p.inc(); 
      alert(p.number); 
     } 
     </SCRIPT> 
    </HEAD> 
    <BODY> 

     <INPUT id="b00" TYPE="button" Value="Click" onClick="returnNumber()"> 

    </BODY> 
    </HTML> 

このコードは意図した通りに動作しません。それは"this"を除いたJavaScriptのオブジェクト変数へのアクセス

this.number=this.number+1; 

を記述することなく動作させるためにそこの方法は、ここでは簡単な選択であるが、より大きなコードでこれを持っていません。*それはたくさん読みやすくなります。出来ますか?

答えて

2

あなたはnumber「プライベート」を作ることができますが、その後、あなたはゲッター必要があります:あなたは「良いパーツをダグラスクロックフォードをお読みください

function Peon(number) { 
     var number = number; 

     // increment 
     this.inc = function() { 
      number++; 
     }; 

     // a simple getter 
     this.getNumber = function() { 
      return number; 
     } 
    } 
    var p = new Peon(10); 
    p.inc(); 
    alert(p.getNumber()); 

をこのパターンの使用方法の詳細については、Google Booksで利用できるプレビューが(限定されて)あります。

また、コンストラクタから何かを返す必要はありません。return trueは不必要です。

+2

クロフォードのプライベートメンバーパターンについては、彼のウェブサイトで読むことができます:http://javascript.crockford.com/private.html **個々のオブジェクトが両方の関数の*独自のコピー*を持つため、多くのPeonsを使用する場合、このプライベートメンバーパターンはプロパティを使用するよりも大幅に多くのメモリを消費することに注意することは非常に重要です**コンストラクタ内で定義されます。それらはオブジェクト間で共有されることはありません。したがって、プライバシーとメモリの使用のトレードオフがあります。メモリ消費はIEとFirefoxの大きな問題です。少数のPeonsしか持たないなら、それは問題ではありません。 –

+0

ありがとう、これは私が探していたものです –

+0

'return true'は実際には余分であり、コンストラクタの最後では無視されますが、プリミティブではなくオブジェクトを返すことは無視されず、 Peon'オブジェクト。 –

0

はそうでもないが、これはサイドノートとして、あなたはペオンのコンストラクタ外の.inc宣言したほうが良いと思います、

this.number++ 

実際にはもう少し簡潔です。プロトタイプでこれを行うことができます。このようにして、Inc関数は、Peon型のオブジェクトを作成するたびに再構築されません。

Peon.prototype.inc = function(){ 
    this.number++; 
} 

またはその代わりに、あなたがp.number++を行うことができp.inc()を使用。これは、このキーワードを避けることができる唯一の方法です。私がやって見ることができます

0

のみ読み込み可能な方法で、それは次のようになります。

this.inc = function() { 
    this.number++; 
}; 

そうでない場合は、あなたの「大きなコード」postulationに、あなたはこのような何か行うことができます:

this.inc = function() { 
    var number = this.number; // obviously simple here. Imagine more complexity 
    number++; 
}; 
+0

が、これは動作しませんあなたの第二の提案... –

1

いいえ、あなたはthisを使用して、thisオブジェクトのプロパティを参照する必要があります。 JavaScriptのthisは、CやJavaなどの他の言語では、thisと大きく異なる点に注意してください。さらにhereおよびhere

コードでは、コンストラクタで作成したthis.numberプロパティではなく、Peonコンストラクタ関数に渡されたnumber引数にアクセスしています。それが意図したとおりに動作しないが失敗しない理由です。

あなたinc操作内ところでPeonコンストラクタ関数と、しないように(Peon経由で作成されたすべての個々のオブジェクトは、その関数のその非常に自身のコピーを取得します)いくつかの理由を定義する理由はありません。ので、代わりに、あなたはこのようにそれを定義することができます。

function Peon(number) { 
    this.number = number; 

    // Don't return values out of constructor functions, it's 
    // an advanced thing to do. In your case, you were returning 
    // `true` which was being completely ignored by the JavaScript 
    // interpreter. If you had returned an object, the `this` object 
    // created for the `new Peon()` call would have been thrown away 
    // and the object you returned used instead. 
} 

Peon.prototype.inc = function() { 
    ++this.number; 
}; 

var p=new Peon(10); 

function returnNumber() { 
    p.inc(); 
    alert(p.number); // alerts 11 
} 
+0

1の閉鎖を経て変数にアクセスすることができます。この2つの組み合わせによって、全体的に大きな回答が得られます。 – Matt

+0

をメモとして - this.numberの代わりに++ this.number ++?私は彼らがわずかに異なって評価することを知っていますが、このユースケースでは互換性があります。私はthis.number ++フォームをより頻繁に見る傾向があるので、ちょうど興味があります。 – Matt

+0

@Matt:私の母国語は英語で、「動詞名詞」は「名詞動詞」よりも劇的に一般的な音声パターンであるため、「x」ではなく「インクリメントx」(「++ x」)インクリメント "(' x ++ ')。もし私がドイツのネイティブスピーカーだったら、私は 'x ++ 'と書くと思う。 :-)大部分のケースでは、現実世界の違いはありません。 (私が「現実世界」を強調するのは、そうでなければルーラーが急いでマイクロ最適化を試みるからです:-)) –

0

はい、javascriptで 'this'を使用する必要はありません。あなたは、あなたと@Ivo両方に代わり「この」

function createPeon(number) { 
 

 
    function inc() { 
 
     number=number+1; 
 
    }; 
 
    function getNumber() { 
 
     return number; 
 
    } 
 

 
    return { inc, getNumber }; 
 
} 
 
var p=createPeon(10); 
 
p.inc(); 
 
alert(p.getNumber());

申し訳