不同文件(JavaScript)中构造函数之间的部分继承?

时间:2015-11-09 03:06:27

标签: javascript inheritance constructor

我在两个不同的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中)是一个未解析的函数或方法调用。

提前致谢!

1 个答案:

答案 0 :(得分:1)

你的例子在这里有几个问题。

  1. 您的两个文件之间存在循环依赖关系,因为它们彼此依赖。一般来说,这是一个坏主意。文件不应该彼此依赖,因为这是意外行为的处方。
  2. 您需要使用第3个构造函数来解决名为Person的问题。 ParentChild都应该从Person继承,您应该在Person中定义常用方法,以及它们在各个文件中的区别。
  3. 以下是它应该如何运作的一个例子:

    // 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
    

    如果你没有得到,我认为问题在于你如何使用你的课程。