0

Javascript OOP を理解しようとしています。クラス内のメソッドを上書きしようとしています。「クリック」が行われたとき、クラスにはデフォルトの機能があります。その機能をオーバーライドしたいので、クリックすると何か新しいことが起こります。

次のようなJavascriptクラスがあります。

AlertModal = function(){
  var x = *this is my close object;

  x.onclick = destoryAlert;

  function destroyAlert(){
    console.log('destroy');
  }
}

私のHTMLファイルは次のように表示されます:

<script type="text/javascript">
  window.alert = function (message) {
    var newAlert = new AlertModal();
    newAlert.destroyAlert = function(){
      console.log('new alert destroy');
    };

    newAlert.destroyAlert();
  };

「新しいアラートの破棄」が表示されます。これは素晴らしいことです。しかし、「x」をクリックすると、破棄も表示されます。上書きされますが、そうではありませんか?呼び出されたときに新しい「destroyAlert」関数を作成するようですが、デフォルトのままです。

デフォルトの機能を備えたクラスを作成するために、これを行う方法を教えてください。ただし、必要に応じて上書きする方法はありますか?

私はJavaとActionscriptでプログラミングし、クラスを拡張し、パブリック/保護されたメソッドを上書きすることに慣れていますが、それを行うJavascriptは非常に異なっているようで、そうするロジックを理解できません.

ありがとう、

4

2 に答える 2

1

インスタンス レベルでメソッドをオーバーライドできます。

AlertModal = function() {
    this.init();
};

AlertModal.prototype.init = function() {
    var modal = this;
    var x = ...;
    x.onclick = function() {
        // Note that I'm not using `this` here, because it would
        // reference `x` instead of the modal. But we can pass the modal
        // from the outer scope. This is called a lexical closure.
        modal.destroy();
    };
};

AlertModal.prototype.destroy = function() {
    console.log('destroy');
};

var myalert = new AlertModal();
myalert.destroy = function() {
    console.log('new destroy');
};

myalert.destroy();

ただし、複数の場所で同じオーバーライドを行いたい場合は、AlertModal クラスから継承して特殊な OtherAlertModal を作成する方がよいでしょう。JavaScript での継承への適切なアプローチを次に示します: http://ejohn.org/blog/simple-javascript-inheritance/

于 2012-09-04T17:55:24.720 に答える
0
x.onclick = destroyAlertl

x のonclickハンドラを参照ローカル関数に設定します

一方

newAlert.destroyAlert = ...

このオブジェクトのdestroyAlertプロパティ セットを別の関数に設定します。に格納されている参照は変更されませx.onclick

prototypeofに「デフォルト」関数を配置する必要がありますAlertModal

AlertModal.prototype.destroyAlert = function() {
     ...
}

ハンドラーを別の方法で登録します。

var self = this;
x.onclick = function() {
    self.destroyAlert();
}

その後、そのようなオブジェクトのプロパティを上書きすると、代わりに新しい関数が呼び出されます。destroyAlert

于 2012-09-04T17:30:16.033 に答える