我正在尝试创建一个由多个类继承的父数据访问层类。
父类:
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可以有特定的逻辑
答案 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..