0

私は JavaScript が初めてで、私の質問はまったくばかげているかもしれません。このための正しい参照を取得できません。

JavaScript でコントローラ オブジェクトを記述しようとしています。ここでのアイデアは、これを誰もがそのプロトタイプから継承し、存在するメソッドをオーバーライドできるインターフェイス オブジェクトにすることです。

1 つのメソッド「process()」をオブジェクトに公開したいだけで、このメソッドは残りのすべてのメソッドと属性を呼び出します。クロージャーを使用して他のすべてのメソッドと属性をプライベートにすることで、これを達成しようとしています。これは私のコードのサンプルスニペットです

var ViewController = function() {

    var _viewName = null;


  var loadView = function(viewName) {

    console.log("now loading view : "+viewName+ " ...");
  };

    return {
        process : function(viewName){
            _viewName = viewName;
            loadView(_viewName);
        }
    };

};


var vController = ViewController();
vController.process("alphaView");

これで問題なく動作します。しかし、プロトタイプを使用してメソッド PreProcess、loadView、initView、および PostProcess をオーバーライドしたい場合、それは機能します。Object.create のようにオーバーライドしてみました

var vController2 = Object.create(ViewController, {

  LoadView : function(viewName) {
    //some custom implementation
  },
  //and so forth
});

また、プロトタイプを使用して外部でメソッドを定義するように実装を変更しても機能しません。お気に入り

 var ViewController = function() {

      var _viewName = null;

      return {
        process : function(viewName){
          _viewName = viewName;
          loadView(_viewName);
        }
      };

    };

    ViewController.prototype.loadView = function(viewName) {

        console.log("now loading view : "+viewName+ " ...");
    };

私の問題の要点は、(a) ユーザーが 1 つの基本的なメソッド (LoadView) をオーバーライドできるコントローラーのインターフェイス オブジェクト、(b) これらのメンバーはすべてコントローラー オブジェクトに対してプライベートであり、「 Process()」メソッド

お知らせ下さい!

編集:コードを編集して簡単にしました。

4

1 に答える 1

1

人々がオーバーライドできるようにしたいメソッドをプロトタイプに置いて、それらが実際のメソッドであり、 によって実際のメソッドとして呼び出されるようにしprocess()ます。次に、このタイプのオブジェクトを作成すると、メソッドの新しいオーバーライド定義を作成できprocess()、元のメソッドの代わりにそれらを自動的に呼び出します。これを行う1つの方法は次のとおりです。

function ViewController() {
}

ViewController.prototype = {
    loadView: function(viewName) {
        console.log("now loading view : "+viewName+ " ...");
    },
    preProcess: function(viewName) {
        console.log("now Pre Processing view : "+viewName+ " ...");
    },
    // other methods here ...
    process: function(viewNmae) {
        this.viewName = viewName;
        console.log(_viewName);
        this.preProcess(_viewName);
        this.loadView(_viewName);
        this.initView(_viewName);
        this.postProcess(_viewName);
    }
}

var controller = new ViewController();
controller.loadView = function(viewName) {
    // override function for loadView
}
controller.process(viewName);

オーバーライド メソッドの呼び出しを本当に禁止したい場合は、javascript の組み込みのプロトタイプ メカニズムの使用をあきらめる必要があります (パブリックであり、そこにある任意のメソッドを呼び出すことができるため)。したがって、独自のスキームを使用して、オーバーライド関数を設定するための新しいパブリック メソッドを追加するだけです。既存のコードで、これを変更します。

return {
    process : function(viewName){
        _viewName = viewName;
        loadView(_viewName);
    }
};

これに:

return {
    process : function(viewName){
        _viewName = viewName;
        loadView(_viewName);
    },
    setLoadViewFn: function(fn) {
        loadView = fn;
    }
    // add other override setting functions here
};


// create controller object
var controller = new ViewController();
// set override function for loadView
controller.setLoadViewFn(function(viewName) {
    // override function for loadView
});
controller.process(viewName);
于 2013-03-17T22:35:35.140 に答える