如何实现此继承模式:object.object.method

时间:2014-12-16 03:00:11

标签: javascript inheritance design-patterns prototype

http://i.stack.imgur.com/wWZ37.png

上面的对象继承取自Mozilla's Tutorial

当我们声明一个类型为Engineer的新人时,它继承自Employee和Workerbee,我们将其声明为:

var Mark = new Engineer() 

但是,我有一些代码,我需要使用这种模式创建一个工程师:

var Mark = new Employee(id).WorkerBee(project).Engineer();

有人可以请一个例子来说明这项工作吗?以下是我的实施



    function Employee(id) {
  //variables
  this.id = id
  this.name = "";
  this.dept = "general";

  //methods
  this.getId = function (){
    return this.id
  }
}
Employee.prototype.WorkerBee = WorkerBee;
Employee.prototype.Engineer = Engineer

function WorkerBee(project) {
  //variables
  this.projectName = project
  this.projects = [];
  //methods
  this.getProjectName = function (){
    return this.projectName
  }
  return this
}
WorkerBee.prototype.Engineer = Engineer

function Engineer() {
   //variables
   this.dept = "engineering";
   this.machine = "";
  //methods
  this.getDept = function(){
    return this.dept
  }
  return this
}

var Mark = new Employee("5").WorkerBee("Secret Project").Engineer();
console.log(Mark.getId()) //prints 5
console.log(Mark.getProjectName()) //prints Secret Project
console.log(Mark.getDept()) //prints engineering




1 个答案:

答案 0 :(得分:1)

我假设您的问题是关于如何进行设置,以便您提出的语法可以完全按照您的指定工作:

var Mark = new Employee(id).WorkerBee(project).Engineer();

所以这篇文章不是关于继承的哲学,不管JS是否有类,或者经典继承是好事,或者你应该使用类系统XYZ,或其他任何东西,但具体是关于如何实现你的语法。

简而言之,如果您尝试遵循“经典”继承,那么您的语法将变得棘手。使用Employee调用时,new构造函数将需要返回一些东西,但此时它对该对象最终会变成什么一无所知。一旦将对象创建为Employee,就不能轻易地将其转换为子类,例如WorkerBee或Engineer,尽管我认为可以使用setPrototypeOf进行调整。

相反,你可以使用一种模糊的寄生方法来继承:

function Employee(id) { 
    this.id = id;

    this.WorkerBee = function(project) {
        this.project = project;

        this.Engineer= function() {
            ...
            return this;
        };

        return this;
    };
}

这不是您的爸爸用Java编程的继承模型。 Employee只有一个构造函数。对象是Engineer还是其他任何东西纯粹是它碰巧包含哪些属性或方法的问题,可以通过WorkerBee等提供的便利方法放置在那里。实例中没有实际的WorkerBee“类”,或构造函数或原型。

这可能会困扰来自Java或C ++等语言的人,但它并没有什么问题,有些人甚至可能会说它更像JavaScript。有一些众所周知的问题,例如方法驻留在实例中,而不是原型。但是,如果您真的想要您提出的语法,那么您将需要朝着这个方向或类似方向前进。