JavaScript 中的真正继承

Real inheritance in JavaScript

我尝试在两个 AngularJS 服务和一个通用服务之间实现原型继承,但这似乎不足以满足我的需求。

我做了 ChildServiceSecondChildServiceParentService

ParentService 有一个方法我们称之为 logIt() 记录 属性 it

现在我认为 ParentService 是“基础 class”,并且我在 ParentService 中有一个调用 logIt() 的方法,即 initialize() .这仅在 ParentService

中实现

我需要 运行 ChildService.initialize() 并查看 ChildServiceit 是否被记录。 与 SecondChildService.

相同

相反,ParentService 记录了它自己的 it 版本。我相信的原因是原型继承是一个组合实现而不是真正的继承

你能提出一个解决方法吗?


编辑:

这是我的 parent 服务

angular.module('common').service('parentService', ParentService);
ParentService.$inject = [];

/* @ngInject */
function ParentService() {
  'use strict';
  var vm = this;
  vm.it = "parent";

  vm.initialize = function () {
    vm.logIt();
  };

  vm.logIt = function () {
    console.log(this.it);
  };
}

这是我的 child 服务

angular.module('common').service('childService', ChildService);
ChildService.$inject = ['parentService'];

/* @ngInject */
function ChildService(parentService) {
  'use strict';
  var vm = this;
  angular.extend(this, parentService);
  vm.it = "child";
}

这就是我在 运行 childService.initialize()

时在日志中得到的内容
parent

我希望得到 child 而不是

我无法重现你的问题。继承似乎在以下示例中正常工作:

class Main {
    do_it() {
        console.log("Main do_it");
        this.it();
    }
    it() {
        console.log("Main it executed");
    }
}

class A extends Main {
    it() {
        console.log("A it executed");
    }
}

var a = new A;
a.do_it();
console.log("Done");

Main class 中定义的 do_it 方法正确调用了扩展 class 的 it 方法,后者覆盖了 it 父方法 class.

问题出在ParentService。我正在使用 vm.logIt,而我应该使用 this.logIt 以便从 child 服务范围获取 it。与标准继承相反,似乎在原型继承中 logIt() 函数存在两次,一次在 ParentService 中,一次在 ChildService 中(继承自 parent)。使用 this.logIt(),您可以从 child 调用它,它实际上从 child 获取 it,而使用 vm.logIt(),您可以从 [=30] 调用它=] 它从哪里得到 it。这是一个范围问题。

这是 ParentService 的正确实现:

angular.module('common').service('parentService', ParentService);
ParentService.$inject = [];

/* @ngInject */
function ParentService() {
  'use strict';
  var vm = this;
  vm.it = "parent";

  vm.initialize = function () {
    this.logIt(); // <-- this changed
  };

  vm.logIt = function () {
    console.log(this.it);
  };
}