Создайте много экземпляров с помощью шаблона модуля

#javascript #encapsulation

#javascript #инкапсуляция

Вопрос:

У меня есть два файла:

 let WordPair = function(wordA, wordB) {
  function doSomething() { ... };

  const smth = wordA   wordB;
  return {doSomething, smth};
};
module.exports = WordPair;
  

 let wordpair = require('./WordPair.js')('dog', 'cat');
wordpair.doSomething();
  

Теперь это работает нормально, но то, что я хочу сделать, это создать много экземпляров WordPair, например, вот так:

 let arr = [];
for (let i = 0; i < 10; i  ) {
  arr.push(new WordPair('xyz', 'abc'));
}
  

Другими словами: как вы могли бы использовать экземпляры класса в Java. Каков правильный способ добиться этого в Javascript?

Ответ №1:

в javascript вы можете использовать шаблон прототипа для достижения этой цели

предположим, что doSomething — это метод класса, который объединяет wordA и WORDDB

 function WordPair(wordA, wordB){
    this.wordA = wordA;
    this.wordB = wordB;
}

WordPair.prototype.doSomething = function(){
    const something = this.wordA   this.wordB;
    console.log(something);
}

const wordPair = new WordPair('xyz', 'abc');

wordPair.doSomething();
  

или другим способом класса es6

 class WordPair {

    constructor(wordA, wordB){
        this.wordA = wordA;
        this.wordB = wordB;
    }

    doSomething(){
        const something = this.wordA   this.wordB;
        console.log(something);
    }

}

const wordPair = new WordPair('xyz', 'abc');

wordPair.doSomething();
  

Комментарии:

1. правильно. Классы JavaScript, представленные в ECMAScript 2015, в основном представляют собой синтаксический сахар по сравнению с существующим наследованием JavaScript на основе прототипов. Синтаксис класса не вводит в JavaScript новую объектно-ориентированную модель наследования.

2. Итак, нет способа сделать то, что я хочу, используя шаблон модуля Reveiling, как я пытался, я должен манипулировать прототипом?

3. Что, если в вашем первом примере я хочу избежать «этого», чтобы сохранить переменные инкапсулированными / закрытыми? Я пытался адаптировать ваш пример, но у меня не получилось. wordA = 'xyz' вместо this.wordA = [...] и в doSomething() замените this.wordA на wordA . Я получаю сообщение об ошибке «wordA не определен».

4. Вы можете создать метод get для wordA и WORDDB, чтобы сохранить их как закрытые. функция WordPair(wordA, worddb){ this.getWordA = function(){ возвращаемое слово; } this.getWordB = function(){ возвращаемое слово; } } WordPair.prototype.doSomething = function(){ const something = this.getWordA() this.getWordB(); console.log(что-то); }

5. Почему невозможно добавить функции получения в прототип так же, как вы сделали с «doSomething»? Выводится ‘undefined’: function WordPair(_wordA){ let wordA = _wordA;} WordPair.prototype.getWordA = function(){ return this.wordA; } const wordPair = new WordPair('xyz'); console.log(wordPair.getWordA());