上面的对象继承来自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

最佳答案

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

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。存在一些众所周知的问题,例如方法驻留在实例中而不是原型中。但是,如果您确实想要所建议的语法,则需要朝这个方向或类似的方向发展。

关于javascript - 如何实现这种继承模式:object.object.method,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27496813/

10-11 19:33
查看更多