nodejs中的父/子类层次结构

时间:2017-01-04 16:41:39

标签: node.js class ecmascript-6

child.js

class Child {
  constructor(){
    this.helloWorld = "Hello World";
  }
  run() {
  }
}

export default new Child();

parent.js

import child from './child.js';
class Parent {
  constructor() {
     this.child = child;
  }
}

export default new Parent();

index.js

import parent from './parent.js'

console.log(parent.child.helloWorld);  <-- does not throws an error, displays "Hello World"
console.log(parent.child.run);  <-- throws an error (Cannot read property run from undefined)
console.log(parent.child.run());  <-- throws an error (Cannot read property run from undefined)

如果我在index.js中执行console.log(parent.child),则运行不会显示,但属性helloWorld会执行..

我怎样才能公开这些功能?我希望能够做到这一点,以帮助我的代码更有条理,所以将它分成单独的类,以帮助最小化每个文件中的代码量。

2 个答案:

答案 0 :(得分:1)

从一开始就明确一件事:您似乎得到的错误与run输出中未显示的console.log无关。

如果您的代码确实抛出了该错误,那么这意味着parent.child的值为undefined。因此,当您致电console.log(parent.child)时,您应该看到undefined,而不是对象。但是,我不知道你为什么会收到这个错误。

无论如何,runparent.child原型上定义,而不是自身。 console.log最有可能显示对象的拥有属性(控制台API未标准化,因此结果可能因环境而异)。 那是正常的

重现的简单示例:

&#13;
&#13;
var foo = {
  x: 42
};
var bar = Object.create(foo);
bar.y = 21;
console.log(bar, bar.x, bar.y);

// Open the browser console to see output
&#13;
&#13;
&#13;

即使bar.x没有显示,也可以访问

console.log(至少在Chrome中)。

答案 1 :(得分:0)

嗯,我不确定是否可以帮助您解决问题,但每当我想添加继承时,我使用extendssuper就是一个例子:

基类:

class BaseDataModel {
  constructor() {

  }

  getModel() {
     return 'model';
  }

module.exports.BaseDataModel = BaseDataModel;

类扩展基类:

"use strict"
// Imports
const BaseDataModel = require('../baseDataModel').BaseDataModel; // use the proper location
class UserMembershipModel extends BaseDataModel {
  constructor() {
    super(); // this is optional, I use this to inherit the constructors
  }

  getChildModel() {
    return super.getModel(); // This is how you access the function from your extended class
  }
module.exports.UserMembershipModel = UserMembershipModel;

同样,不确定它是否解决了您的问题,因为您实际添加了具有Child类的属性。我的示例实际上是扩展(或UserMembershipModel继承自BaseDataModel)。

希望这对你有所帮助。