1

手続き型JSをOOに変換しているので、助けていただければ幸いです。一言で言えば、私が持っているのは、以下を含むhtmlページです。

<script type="text/javascript">
  var serverTime='11:32:20';  //time generated by server (php)
</script>
<script scr="myProcFuncs.js" type="text/javascript">
  /* which is containing procedural functions such as
  function getServerTime() {return window.serverTime;}
  */
</script>

私がやりたいのは、多かれ少なかれトラフィックを増やすことなく、クリーンアップすることです...

<script type="text/javascript">
  function myOb() {
    this.serverTime = '11:32:20';
    this.serverDate = '2010-09-24';
  }
  //first question, need/recommended to create a class??
  var myCl = myOb();
</script>
<script scr="myMethods.js" type="text/javascript">
  //second question, how to append methods to initiated class or object?
</script>

私が求めているのは、機能するものだけでなく、OO-JSのベストプラクティスです。外部のmyMethods.jsなどの読み込みの遅延も考慮してください...

私が検討しているオプションは次のとおりです。

  • §1、例として、開始されたクラス(または可能であれば静的オブジェクト)にメソッドを追加します。その場合は、メソッドの追加の例を投稿してください。

  • §2(最悪の場合)は2つのオブジェクトを使用します。1つはプロパティ(サーバー生成)用で、もう1つはメソッド用です。

この問題の光に感謝します、すべての最高

//トムジョード

4

2 に答える 2

1
function myOb() {
    this.serverTime = '11:32:20';

これは機能しません。this関数で意味を持つのは、オブジェクトのメソッドとして、またはnew演算子で呼び出されている場合のみです。

myOb()の代わりにnew myOb()行う場合thisは、グローバル(window)オブジェクトになり、割り当てることthis.serverTimeでグローバル変数が効果的に作成されます。これは、そもそも避けようとしていたことです。(また、関数からの戻り値がない場合は、myClになりますundefined。)

複数のインスタンスやプロトタイピングを必要とすることは実際には行われていないようですので、関数を忘れて、オブジェクトリテラルを使用してください。

var pageValues= {
    serverTime: '11:32:20',
    serverDate: '2010-09-24'
};

サーバー側でJSONエンコーダーを使用すると、このようなコードを簡単に生成できます。たとえば、使用しているサーバー側の言語がPHPの場合、次のようになります。

<?php
    $pageValues= array('serverTime'=>'11:32:20', 'serverDate'=>'2010-09-24');
?>
<script type="text/javascript">
    var pageValues= <?php echo json_encode($pageValues); ?>;
</script>

開始されたクラスまたはオブジェクトにメソッドを追加する方法は?

インライン関数式を使用します。

pageValues.someMethod= function() {
    ...do something...
};

しかし、これが本当にあなたに何かをもたらすかどうかはわかりません。JavaScriptは混合スクリプト言語であり、Javaのように考えて、すべてをオブジェクトやクラスに強制しようとする必要はありません。(特に、実際にはクラスを取得せず、プロトタイピングを使用して独自のクラスを作成する必要があるためです。)

于 2010-09-25T18:24:57.173 に答える
0

今のところ、で解決しました(そしていくつかのタイプミスを修正しました...):

<script type="text/javascript">
  function myCl() {
    this.serverTime = '11:32:20';
    this.serverDate = '2010-09-24';
  }
  var myOb = new myCl();
</script>
<script scr="myMethods.js" type="text/javascript">
  /* myMethods.js containing methods as..
  myOb.getTime = function() {
    return this.serverTime;
  } 
  */
</script>

動作します。誰かがより良い方法を知っているなら、投稿してください。

于 2010-09-25T19:31:45.290 に答える