0

我是 javascript 新手,我的问题可能非常愚蠢。我无法为此获得正确的参考。

我正在尝试用 javascript 编写一个控制器对象。这里的想法是使它成为一个接口对象,任何人都可以从它的原型继承并覆盖他们存在的方法。

我只想向对象公开一个方法“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)控制器的接口对象,用户可以在其中覆盖一个基本方法(LoadView,)(b)所有这些成员都是控制器对象私有的,并且可以通过“过程()”方法

请指教!

编辑:编辑代码以使其简单。

4

1 回答 1

1

将您希望人们能够覆盖的方法放在原型上,以便它们是真正的方法并被process(). 然后,一旦您创建了这种类型的对象,您就可以为任何方法创建新的覆盖定义,process()并将自动调用它们而不是原始方法。一种方法是这样的:

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 回答