#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());