我在两个不同的js文件中有两个构造函数。我希望构造函数有两个相同的方法(相同的名称和功能)和一个被称为相同但方法不同的方法(相同的名称,但不是相同的功能)。两个构造函数中还会有一些其他属性相同。
我试图实现这一点的方法是让其中一个构造函数继承另一个,然后声明一个与旧方法同名的新方法(见下文)。当构造函数位于同一个文件中时,这很好(我相信),但是当它们位于不同的文件中时,我似乎失去了连接。继承不起作用。
代码看起来类似于:
文件1 :(有人建议删除第一行以避免流通,但它似乎没有任何区别)
var Child = require("./Child");
var Parent = function(name, age) {
this.name = name;
this.age = age;
};
Parent.prototype.calculate1 = function(a, b) {
return a + b;
};
Parent.prototype.calculate1 = function(a, b) {
return a - b;
};
Parent.prototype.calculate3 = function() {
return "Armageddon";
};
module.exports = Parent;
文件2:
var Parent = require("./Parent");
var Child = function(name, age) {
Parent.call(this, name, age);
};
Child.prototype = Object.create(Parent.prototype);
Child.prototype.calculate3 = function() {
return "Deep Impact";
};
module.exports = Child;
所以,我想它更像是两个问题。 1)这是解决问题的好方法吗? 2)当构造函数位于单独的文件中时,为什么它不起作用?在Webstorm中,我注意到方法调用(在Parent.call中)是一个未解析的函数或方法调用。
提前致谢!
答案 0 :(得分:1)
你的例子在这里有几个问题。
Person
的问题。 Parent
和Child
都应该从Person
继承,您应该在Person
中定义常用方法,以及它们在各个文件中的区别。以下是它应该如何运作的一个例子:
// Person.js
function Person (name, age) {
this.name = name;
this.age = age;
}
Person.prototype.someShareMethod = function (a, b) {
return a + b;
};
module.exports = Person;
// Parent.js
var Person = require('./Person');
function Parent (name, age) {
Person.call(this, name, age);
}
Parent.prototype = Object.create(Person.protoype);
Parent.prototype.someSelfMethod = function (a, b) {
return a * b;
};
module.exports = Parent;
// Child.js
var Person = require('./Person');
function Child (name, age) {
Person.call(this, name, age);
}
Child.prototype = Object.create(Person.protoype);
Child.prototype.someSelfMethod = function (a, b) {
return a - b;
};
module.exports = Child;
所有这一切,你的继承的一般概念应该有效。一旦构造函数可以从另一个继承,这是一个非常好的做法。我打破了你的代码(删除了循环引用),在本地运行,得到了预期的输出:
var Parent = require('./Parent'),
Child = require('./Child');
var p = new Parent('Bob', 40);
console.log(p.calculate3());
var c = new Child('Stan', 12);
console.log(c.calculate3());
记录了这个:
Armageddon
Deep Impact
如果你没有得到,我认为问题在于你如何使用你的课程。