访问父类中的属性

时间:2014-06-04 11:37:07

标签: javascript inheritance prototype

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

父类:

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父类的共享逻辑工作,然后我的扩展class可以有特定的逻辑

3 个答案:

答案 0 :(得分:0)

你可以从这样的结构开始:

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

答案 1 :(得分:0)

我遇到的问题是我想重用相同的代码。我想我已经用这种方式解决了这个问题,我仍然不是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. 

答案 2 :(得分:0)

不要在构造函数中使用.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,将其定义为prototype属性。

第三:当调用此行aJob.Save();时,它将调用

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

Job.prototype.Save()将搜索名为Save()的函数。在Job的原型中没有定义,因此函数未定义错误将发生。

第四:除了DataAccess.call()或Job.call()之外,无法调用call();
call()就像构造函数调用一样,除了它的第一个参数get赋值给构造函数的这个对象 在这里,我改进了你的代码。只需将其复制并粘贴到您的编辑器中,看看这里发生了什么。

试试这个:

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..