【问题标题】:How to implement this inheritance pattern: object.object.method如何实现这种继承模式:object.object.method
【发布时间】:2014-12-16 03:00:11
【问题描述】:

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

【问题讨论】:

  • WorkerBee的原型依赖于Engineer,同样Engineer的原型依赖于WorkerBee?
  • new Employee() 返回一个普通对象,即 Employee 的一个实例。它没有 WorkerBee 方法。
  • 我需要使用这种模式创建工程师……”,为什么?
  • Pablo,看看组合继承。
  • @thefourtheye 这是一个错误,谢谢指出

标签: javascript inheritance design-patterns prototype


【解决方案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。有一些众所周知的问题,例如方法驻留在实例中,而不是原型中。但是,如果您真的想要您提出的语法,您将需要朝这个方向或类似的方向发展。

【讨论】:

  • 你说得对,那个语法是我最初的目标。我玩弄了它,偶然发现了一个与您类似的工作实现,除了使用原型。我用一个可行的解决方案编辑了我的原始帖子。您能否评论一下我如何使用原型关键字对其进行改进以避免嵌套?我对解决方案仍然模糊不熟悉,尤其是 Employee.prototype.WorkerBee = WorkerBee;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2012-03-03
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多