Javascript метод доступа к объекту внутри объекта - PullRequest
0 голосов
/ 28 апреля 2018

Прежде всего, я знаю, что с помощью this можно получить доступ к свойствам или методам внутри объекта javascript, но что-то не работает в моем примере.

module.exports = {
    explanations: {
        '--help': 'show help',
        '--connection': 'list connections'
    },
    connections: {
        'a': '1',
        'b': '2',
        'c': '3'
    },
    manPageOfObject: function(object) {
         var output = '';
         var keys = Object.keys(object);
         for (var i in keys) {
              output += keys[i] + ': ' + object[keys[i]] + '\n';
         }
         return output;
   },
   manPages: {
       '--help': function() { return this.manPageOfObject(this.explanations); }
       '--connections': function() { return this.manPageOfObject(this.connections); }
   }
}

Функция manPageOfObject должна возвращать строку / «справочную страницу» объекта.

Затем я хочу напечатать "страницу руководства", например:

var myModule = require('xyz.js');

var manPage = myModule.manPages['--help'];
console.log(manPage());

Но что-то не работает должным образом, я получаю сообщение об ошибке this.manPageOfObject не является функцией. Но я уверен, что это один, не так ли?

Я ценю любую помощь. Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Какую ошибку вы получаете, когда пытаетесь запустить его? Это может быть хорошим намеком.

var manPage = myModule.manPages['--help'];
                               ^
TypeError: Cannot read property '--help' of undefined

У тебя опечатка. Вы экспортируете manPage, а не manPages. Ваша следующая проблема будет из-за this.

0 голосов
/ 28 апреля 2018

У вас есть вложенные объекты, что означает, что у вас нет ни одного отдельного контекста.

manPageOfObject на myModule. Таким образом, чтобы функция могла найти manPageOfObject, она должна иметь в качестве контекста (как this) объект myModule.

Теперь manPage - это отдельный объект. У него нет свойства manPageOfObject. Поэтому, если вы просто наберете manPage.something() и something() попытается использовать свойство manPageOfObject, оно не найдет его, потому что manPage не имеет его.

Вы должны привязать myModule.manPage['--help'] к myModule (myModule.manPage['--help'].bind(myModule)), чтобы он мог выбрать manPageOfObject в this:

var myModule = {
  explanations: {
    '--help': 'show help',
    '--connection': 'list connections'
  },
  connections: {
    'a': '1',
    'b': '2',
    'c': '3'
  },
  manPageOfObject: function(object) {
    var output = '';
    var keys = Object.keys(object);
    for (var i in keys) {
      output += keys[i] + ': ' + object[keys[i]] + '\n';
    }
    return output;
  },
  manPage: {
    '--help': function() {
      return this.manPageOfObject(this.explanations);
    },
    '--connections': function() {
      return this.manPageOfObject(this.connections);
    }
  }
};
var manPage = myModule.manPage['--help'].bind(myModule);
console.log(manPage());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...