Что-то не так при сбросе конструктора javascript - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь понять наследование в JavaScript.Я написал базовый пример для реализации простого наследования между родительским объектом и дочерним объектом.Но я думаю, что что-то не так при сбросе конструктора.

function Mammal(){
}
function Dog(){

}
Mammal.prototype.walk = function(){
    console.log('walking..walking....');
}
Dog.prototype.bark = function(){
    console.log('wof wof!');
}

Dog.prototype = Object.create(Mammal.prototype);
Dog.prototype.constructor = Dog;
let dogInstance = new Dog();
dogInstance.walk();
dogInstance.bark();

Ответы [ 3 ]

0 голосов
/ 14 октября 2018

Проблема здесь Dog.prototype = Object.create(Mammal.prototype);Попытайся

[Редактировать]

function Mammal() {}
function Dog() {}
Mammal.prototype.walk = function () {
    console.log( 'walking..walking....' );
};
Dog.prototype.bark = function () {
    console.log( 'wof wof!' );
};

[/ Редактировать]

let describe = Object.getOwnPropertyDescriptor;
let descriptor = Object.keys( Mammal.prototype ).reduce( function ( desc, key ) {
    desc[key] = describe( Mammal.prototype, key );
    return desc;
}, {} );
Dog.prototype = Object.create( Dog.prototype, descriptor );

[Редактировать]

Dog.prototype.constructor = Dog;
let dogInstance = new Dog();
dogInstance.walk();
dogInstance.bark();

Или использовать Наследование объектов следовать этому

function Mammal( key ) { this.key = key; }
function Dog() {
    Mammal.call( this, "Dog" );
}
Dog.prototype = Object.create( Mammal.prototype );
Dog.prototype.bark = function () {
    console.log( 'wof wof!' );
};
Mammal.prototype.walk = function () {
    console.log( 'walking..walking....' );
    return `${this.key} from Mammal.`;
};
Dog.prototype.constructor = Dog;
let dogInstance = new Dog();
dogInstance.walk();
dogInstance.bark();

Сравнить dogInstance

 Mammal.prototype.isPrototypeOf( dogInstance );
 Dog.prototype.isPrototypeOf( dogInstance );

Это работа для меня: (

[/ Edit]

0 голосов
/ 14 октября 2018

Я думаю, что что-то не так при сбросе конструктора.

Нет, нет .

Ваша проблема в том, что вы делаете

Dog.prototype = Object.create(Mammal.prototype);

после того, как создал метод bark для старого объекта Dog.prototype, который вы перезаписываете новым пустым объектом.Просто сделайте это перед любыми заданиями:

function Mammal() {
}
Mammal.prototype.walk = function(){
    console.log('walking..walking....');
};

function Dog() {
}
Dog.prototype = Object.create(Mammal.prototype); // do this before creating properties
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function() {
    console.log('wof wof!');
};
0 голосов
/ 14 октября 2018

Я не совсем уверен в этом, но эта строка является проблемой:

Dog.prototype = Object.create(Mammal.prototype);

Очевидно, вы не можете передать прототип Mammal непосредственно прототипу Dog

function Mammal() {
}
function Dog() {

}
Mammal.prototype.walk = function () {
	console.log( 'walking..walking....' );
}
Dog.prototype.bark = function () {
	console.log( 'wof wof!' );
}

Dog.prototype.mammal = Object.create( Mammal.prototype );
Dog.prototype.constructor = Dog;
let dogInstance = new Dog();
dogInstance.mammal.walk();
dogInstance.bark();

это похоже на работу

...