【问题标题】:Issues with Javascript inheritance & base class prototypeJavascript继承和基类原型的问题
【发布时间】:2013-11-27 05:13:44
【问题描述】:

我在继承时遇到了配置对象的问题 所以我有

baseclass.prototype.activity =function(){ console.log("Im"+activity); }

以及继承基类的多个其他对象(例如 A 和 B)。

我想根据 A 和 B 的类型配置运行 因此,如果它是 A,那么调用 run 应该使活动成为 Running,并且与 B 类似,它可以游泳 我正在使用以下工厂方法来创建 A 和 B,具体取决于它们的类型

activityFactoryObject.prototype.makeObj = Object.create(baseclass);
activityFactoryObject.prototype.createObject = function (config) {

    switch (config) {
    case "running":

        this.makeObj = A;
        break;
    case "swimming":

        this.makeObj = B;

        break;
    }
    this.makeObj.prototype = baseclass.prototype;  
    return new this.makeObj(config); 

};

【问题讨论】:

    标签: javascript inheritance prototype


    【解决方案1】:

    我不确定你的目标是什么,但如果它们都继承自 baseClass 并且唯一的区别是活动显示的内容,那么这样的东西就足够了:

    baseClass.protoype.activity = function ( activity ) { console.log( "I'm " + activity ); };
    
    var a = new BaseClass(),
        b = new BaseClass();
    
    a.activity( 'Running' ); // -> "I'm Running"
    b.activity( 'Swimming' ); // -> "I'm Swimming"
    

    【讨论】:

    • 既然是原型,会共享一个共同的实例吗??
    • 该函数的一个常见实例,但看起来您并没有将他们正在执行的活动存储在您的代码中,只是将其打印出来。如果您想存储它需要更多更改,我不确定您是否需要子对象,只是实例,您可以轻松地拥有一个单独的活动实例并且仍然共享相同的活动方法,我会使用 getter 和二传手。我会做一个jsfiddel更好地解释
    【解决方案2】:

    不确定这是不是你想要的:

    var Activity = function(argsObj){
      this.activityType = argsObj.activityType || "Default value";
    };
    Activity.prototype.doIt = function(){
      console.log("I am " + this.activityType);
    };
    
    var Run = function(argsObj){
      //re use Activity initializer
      Activity.apply(this,arguments);
    };
    Run.prototype=Object.create(Activity.prototype);
    Run.prototype.constructor = Run;
    
    var Swim = function(argsObj){
      //re use Activity initializer
      Activity.apply(this,arguments);
    };
    Swim.prototype=Object.create(Activity.prototype);
    Swim.prototype.constructor = Swim;
    
    function activityFactory(argsObj){
      return new window[argsObj.type](argsObj);
    }
    
    var r = activityFactory({type:"Run",activityType:"running"});
    var s = activityFactory({type:"Swim",activityType:"swimming"});
    r.doIt();//I am running
    s.doIt();//I am swimming
    console.log(r instanceof Run);//true
    console.log(s instanceof Swim);//true
    console.log(s instanceof Activity);//true
    var wrong = activityFactory({type:"Run"});
    wrong.doIt();//I am Default value
    

    更多关于构造函数和原型:https://stackoverflow.com/a/16063711/1641941

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      相关资源
      最近更新 更多