2015-12-04 3 views
0

я следующий модуль/класс и настройка подмодульКак получить доступ к родительским методам из подмодуля?

MyAPI.js

class MyAPI { 
    construction(){ 
    this.food = require('./Food'); 
    } 
} 
module.exports = MyAPI; 

Food.js

class Food { 
    constructor(){ 
    ... 
    } 
} 
module.exports = Food; 

app.js

var api = require('./MyAPI'); 
var taco = new api.food; 
var cheeseburger = new api.food; 

Что я задаюсь, это возможно с все свойства и функции MyAPI формируются в пределах Food.js? Должен ли я пройти this в требование как-то?

this.food = require('./Food')(this); // this didn't work... 

выше в результате этого:

TypeError: Class constructors cannot be invoked without 'new' 

Но почему я использую new в MyAPI конструктор?

Каков наилучший подход для создания подклассов и подмодулей и создания из них новых объектов?

+0

Вы хотите 'новый (требуется ('./ Food')) (это)'. В любом случае вы никогда не должны ставить конструкторы как методы для экземпляров. – Bergi

ответ

0

this.food присваивается в конструкторе MyApi, поэтому вам необходимо создать экземпляр MyApi, чтобы доступ к этой недвижимости.

var Api = require('./MyAPI'); 
var apiInstance = new Api(); 
var foodInstance = new apiInstance.food(); 

Ваш комментарий, кажется, что вы хотите свойства MyAPI, особенно config быть доступным подмодулями. Я не вижу способ сделать это, за исключением, чтобы сделать ваш верхний уровень API объекта синглтона:

var MyAPI = { 
    config: { setting: 'default' }, 
    Food: require('./Food') 
} 

module.exports = MyAPI; 
var MyApi = require('./my-api.js'); 

class Food { 
    constructor(){ 
    // MyApi.config 
    } 
} 
module.exports = Food; 

Глядя на AWS source они делают что-то подобное (кроме config это собственный модуль установленный на верхнем уровне AWS объект).

+0

Значит ли это, что я могу создать только один экземпляр apiInstance.food? Кажется странным использовать 'new' в конструкторе api, подобном этому, а не в моем приложении. –

+0

В этом случае да. Это полностью зависит от того, как вы это используете. Вы можете так же легко выставить конструктор 'Food' как статическое свойство вашего класса. Обычно вы хотели бы, чтобы экземпляр мог удерживать состояние для соединения (данные auth и т. Д.). –

+0

Как AWS делает это со своим SDK здесь, затем http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-examples.html? Они создают объект AWS, а затем создают экземпляр класса S3 как свойство объекта AWS с использованием 'new'? Этот подход - это то, что я пытаюсь подражать. –

1

Я думаю, что вы путаете классы и экземпляры:

var MyAPI = require('./MyAPI');//this is a class 
var apiInstance = new MyAPI();//the creates a new instance of your class 
var taco = new apiInstance.food //the food property on your api is a class not an instance 
var tacoInstance = new taco(); 
Смежные вопросы