【问题标题】:Accessing properties in parent class访问父类中的属性
【发布时间】:2014-06-04 11:37:07
【问题描述】:

我正在尝试制作一个由多个类继承的父数据访问层类。

父类:

var DataAccess = function() {
   this.Save = function(){
        alert(this.ListName);  //works
        SaveLogic(this.Id);    //doesnt work
}
}

儿童班:

var Job = function(){
  Job.prototype.ListName = 'MyList';  //works

  this.Save = function(){
  Job.prototype.Save().call(this);
  //specific Job Save logic
  }
}

Job.prototype = new DataAccess();

现在在我的主要课程中:

var aJob = new Job();
aJob.Id = 1;
aJob.Save();  //Does not work. Prototype can not see aJob.Id..

如您所见,我需要创建一个带有ID等共享变量的父函数,所以当我继承父类时,我可以为这些变量赋值,这样hte父类的共享逻辑就可以工作,然后我的扩展类可以有特定的逻辑

【问题讨论】:

  • 永远不要在构造函数中向原型添加方法。
  • 您的代码 sn-p 要么不完整,要么您忘记让 Job 原型继承自 DataAcess。无论哪种方式,您的 sn-p 都表明您对 javascript 中原型继承的工作原理知之甚少。
  • 我忘了在 sn-p 中添加一行。
  • 省略Job.prototype.Save().call中的括号。
  • SaveLogic(this.Id) 应该做什么?因为SaveLogic 没有定义,所以它不起作用吗?或者什么不起作用?

标签: javascript inheritance prototype


【解决方案1】:

你可以像这样开始构建:

var DataAccess = function() {
    this.Save = function(){
        console.log('DataAccess Save call', this.ListName, this.Id);
    }
}

var Job = function(){
  this.ListName = 'MyList';
}
Job.prototype = new DataAccess();
/**
 * Delete me to use parent's Save method.
 */
Job.prototype.Save = function(){
    console.log('Job Save call', this.ListName, this.Id);
}

var aJob = new Job();
aJob.Id = 1;
aJob.Save();

@stivlo 在他的回答中描述了它是如何工作的:https://stackoverflow.com/a/4778408/1127848

【讨论】:

    【解决方案2】:

    我遇到的问题是我想重用相同的代码。我想我已经这样解决了,我仍然不是 100% 的原型编程的正确方法:

    function DataAccess() {
       //setup common variables
    }
    
    DataAccess._Save_(listname, id){
       commonSaveLogic(id);
       doStuff(listname);
    }
    
    function Job() {
        this.ListName = 'Jobs';
        DataAccess.call(this); //call DataAccess Constructor
    }
    
    Job.prototype = DataAccess;
    Job.prototype.constructor = Job;
    
    Job.ProtoType.Save = function(){
       this._Save_(this.ListName, this.Id);
    }
    
    
    function AotherList() {
          this.ListName = 'AnotherList';
          DataAccess.call(this);
    }
    //same as above. Job and Another list both inherit off DataAccess. 
    

    【讨论】:

    • 为什么方法名改为_Save_
    • 不,Job.prototype = DataAccess;utterly wrong
    【解决方案3】:

    不要在构造函数中使用 .prototype。我们定义 .prototype 以将相同的副本共享给所有对象。

    你在这里遗漏了很多东西。我一一解释:

    第一:SaveLogic(this.Id); //doesnt work
    因为您没有在函数中使用this,所以它是一个全局函数而不是构造函数。而且你没有在任何地方定义它,所以会出现像function SaveLogic not defined这样的错误
    为防止出现此错误,请在某处定义函数。

    第二:您已将this.Id 作为参数传递。使用aJob.Id = 1; 行的Id 将无法在SaveLogic(this.Id); 中访问,因为Id 是aJob 的属性,而不是ajob.prototype 的属性。 this.ListName 将在此处可用,因为它是原型的属性。 因此,如果您想在 SaveLogic() 函数中获取 Id,请将其定义为原型属性。

    第三:当这条线aJob.Save();被调用时,它会调用

    this.Save = function(){
      Job.prototype.Save().call(this);
      //specific Job Save logic
    }
    

    Job.prototype.Save() 将搜索名为 Save() 的函数。 Job 的原型中没有定义,所以会出现 function not defined 错误。

    第四:call() 无论如何都不能被调用,除了 DataAccess.call() 或 Job.call();
    call() 就像构造函数调用一样,除了它的第一个参数被分配给构造函数的 this 对象。
    在这里,我改进了您的代码。只需将其复制并粘贴到您的编辑器中,看看这里发生了什么。

    试试这个:

    function SaveLogic(Id)
    {
        alert(Id);
    }
    var DataAccess = function() {
       this.Save = function(){
            alert(this.ListName);  //works
            SaveLogic(this.Id);
            return this;        //doesnt work
        }
        this.call = function() {
            alert('call is called here');
        }
    }
    
    var Job = function(){
      Job.prototype.ListName = 'MyList';  //works
    
      this.Save = function(){
        //console.log(Job.prototype.Save());
        Job.prototype.Save().call(this);
        //specific Job Save logic
      }
    }
    Job.prototype = new DataAccess();
    
    var aJob = new Job();
    Job.prototype.Id = 1;
    aJob.Save();  //Does not work. Prototype can not see aJob.Id..
    

    【讨论】:

    • 仅显示 Job 正在继承 DataAccess 属性。我觉得这没什么问题。
    猜你喜欢
    • 1970-01-01
    • 2019-08-24
    • 2015-02-27
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多