partyzanx
@partyzanx

Как решить проблему при создании прототипа объекта?

Создаю прототипы объекта, но на выходе получается големотья.
Помогите, пожалуйста
let Unit = {
constructor: function(type,name,force) {
this.type = type;
this.name = name;
this.force = force;
return this
},
greet: function() {
console.log(this.name[0].toUpperCase() + this.name.slice(1) + " ready!")
}
};

let Infantry = Object.create(Unit);
Infantry.constructor = function(type,name,force,infrantryPosibilities) {
Unit.constructor.apply(this,arguments);
this.infrantryPosibilities = infrantryPosibilities || [];
return this;
};

let romanInfantry = Object.create(Unit).constructor('infantry','Caesar Infantry', 15,[1,5,67]);

console.log(romanInfantry.greet()) 
/* Caesar Infantry ready!
(index):53 undefined */
// должна выдавать строку

console.log(romanInfantry) // constructor {type: "infantry", name: "Caesar Infantry", force: 15}
// должна выдавать объект romanInfantry

  • Вопрос задан
  • 51 просмотр
Решения вопроса 1
@ukbpyh
console.log(romanInfantry.greet())
/* Caesar Infantry ready!
(index):53 undefined */
// должна выдавать строку

Вам и выдаёт строку:
Caesar Infantry ready! 9:13
а далее функция romanInfantry.greet() возвращает undefined,
undefined 22:13
т.к. в ней у вас не указано возвращаемое значение (return ...)
Чтобы этой строки (undefined) не было можете просто написать: romanInfantry.greet().

console.log(romanInfantry) // constructor {type: "infantry", name: "Caesar Infantry", force: 15}
// должна выдавать объект romanInfantry

Вам этот объект и выдаёт, просто этот объект, видимо, представляет из себя не то, что вы ожидаете.

Кстати, обращаю ваше внимание, что в строке
let romanInfantry = Object.create(Unit).constructor('infantry','Caesar Infantry', 15,[1,5,67]);

Вы используете 4 аргумента, тогда как в методе объекта-прототипа Unit у вас только 3.
То, что вы создали собственный метод constructor в Infanity,
Infantry.constructor = function(type,name,force,infrantryPosibilities) {
Unit.constructor.apply(this,arguments);
this.infrantryPosibilities = infrantryPosibilities || [];
return this;
не изменило оригинальный объект Unit.

Рекомендую вам также провести полную ревизию всего кода, так как выбранный вами способ создания прототипов крайне сомнителен. Должно быть примерно так (если не использовать синтаксис объявлений классов):
// создаёте конструктор класса Unit
function Unit(type,name,force) {
    this.type = type;
    this.name = name;
    this.force = force;
}

// создаёте наследуемые свойства/методы Unit
Unit.prototype = {
    constructor: Unit,
    greet: function() {
        console.log(this.name[0].toUpperCase() + this.name.slice(1) + " ready!")
    }
};
    
// создаёте конструктор класса Infantry
function Infantry(type,name,force,infrantryPosibilities) {
    Unit.call(this,type,name,force);
    this.infrantryPosibilities = infrantryPosibilities || [];
}

// наследуете Infantry класс Unit и замещаете родительское свойство constructor, на новое
Infantry.prototype = Object.create(Unit.prototype, {
    constructor: {
        value: Infantry,
        enumerable: true,
        writable: true,
        configurable: true
    }
});

// создаёте новый экземпляр класса Infantry, наследника Unit.
let romanInfantry = new Infantry('infantry','Caesar Infantry', 15,[1,5,67]);

romanInfantry.greet();
console.log(romanInfantry);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы