#javascript
#javascript
Вопрос:
Я хотел больше узнать о шаблоне составного проектирования. Я пишу на JS, поэтому просматривал его пример, когда наткнулся на эту статью.
function File(name) {
this.name = name;
}
File.prototype.display = function () {
console.log(this.name);
}
function Directory(name) {
this.name = name;
this.files = [];
}
Directory.prototype.add = function (file) {
this.files.push(file);
}
Directory.prototype.remove = function (file) {
for (let i = 0, length = this.files.length; i < length; i ) {
if (this.files[i] === file) {
this.files.splice(i, 1);
return true;
}
}
return false;
}
Directory.prototype.getFileName = function (index) {
return this.files[index].name;
}
Directory.prototype.display = function() {
console.log(this.name);
for (let i = 0, length = this.files.length; i < length; i ) {
console.log(" ", this.getFileName(i));
}
}
directoryOne = new Directory('Directory One');
directoryTwo = new Directory('Directory Two');
directoryThree = new Directory('Directory Three');
fileOne = new File('File One');
fileTwo = new File('File Two');
fileThree = new File('File Three');
directoryOne.add(fileOne);
directoryOne.add(fileTwo);
directoryTwo.add(fileOne);
directoryThree.add(fileOne);
directoryThree.add(fileTwo);
directoryThree.add(fileThree);
directoryOne.display();
directoryTwo.display();
directoryThree.display();
Из этой статьи
Я все еще не совсем понимаю шаблон составного проектирования и был бы рад, если бы кто-нибудь мог объяснить мне это, используя приведенный выше фрагмент кода.
Комментарии:
1. Что именно неясно? В статье это объясняется довольно хорошо.
2. Также обратите внимание, что современный JS уже довольно давно имеет «нормальный» синтаксис класса (это все еще прототипное наследование , но с кодом намного проще работать для целей ООП).
class File { constructor(name) { this.name = name; } display() { console.log(this.name); }}
и т.д.
Ответ №1:
Давайте представим, что вы пишете класс js, ниже будет функция конструктора
function File(name) {
this.name = name;
}
чтобы вызвать его, вы бы использовали const myName = new File('Salim')
Ниже будет метод в классе, хотя, если бы внутри класса был определен метод с тем же именем, он был бы оценен вместо этого.
File.prototype.display = function () {
console.log(this.name);
}
myName.display()
оценил бы Salim
. Если вы это поняли, то остальное должно быть понятным. Вышеизложенное также можно переписать как
class File{
constructor(name){
this.name=name
}
display=()=>{
console.log(this.name)
}
}