JavaScript 中的真正继承
Real inheritance in JavaScript
我尝试在两个 AngularJS 服务和一个通用服务之间实现原型继承,但这似乎不足以满足我的需求。
我做了 ChildService
、SecondChildService
和 ParentService
。
ChildService
使用原型继承扩展 ParentService
SecondChildService
使用原型继承扩展 ParentService
ParentService
有一个方法我们称之为 logIt()
记录 属性 it
ChildService
实现了自己的 it
版本
SecondChildService
实现了自己的 it
版本
现在我认为 ParentService
是“基础 class”,并且我在 ParentService
中有一个调用 logIt()
的方法,即 initialize()
.这仅在 ParentService
中实现
我需要 运行 ChildService.initialize()
并查看 ChildService
的 it
是否被记录。
与 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);
};
}
我尝试在两个 AngularJS 服务和一个通用服务之间实现原型继承,但这似乎不足以满足我的需求。
我做了 ChildService
、SecondChildService
和 ParentService
。
ChildService
使用原型继承扩展ParentService
SecondChildService
使用原型继承扩展ParentService
ParentService
有一个方法我们称之为 logIt()
记录 属性 it
ChildService
实现了自己的it
版本
SecondChildService
实现了自己的it
版本
现在我认为 ParentService
是“基础 class”,并且我在 ParentService
中有一个调用 logIt()
的方法,即 initialize()
.这仅在 ParentService
我需要 运行 ChildService.initialize()
并查看 ChildService
的 it
是否被记录。
与 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);
};
}